Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- #include <algorithm>
- using namespace std;
- int table[10];
- string code;
- int max(int a, int b, int c) {
- return max(max(a, b), c);
- }
- int max(int a, int b, int c, int d) {
- return max(max(a, b, c), d);
- }
- #define h(x) (table[x] == 0 ? 0 : (32 - __builtin_clz(p[x])))
- #define d(maxY) for(int id = maxY - 1 ; id >= 0 ; id --){ bool correct = true; for(int j = 0 ; j <= 9 ; j++)if(!(p[j] & (1 << (y + id)))){ correct = false; } if(correct){ dd++; for(int j = 0 ; j<= 9 ; j++)p[j] = ((p[j] >> (y+id+1)) << (y+id)) + p[j] % (1 << (y+id));} }
- int calccount(int p[10], int nr, int solution) {
- int cp[10];
- for (int j = 0; j < 10; j++)cp[j] = p[j];
- int count = -1;
- if (nr >= code.length()) {
- return solution;
- }
- if (code[nr] == 'I') {
- for (int i = 0; i <= 9; i++) {
- int y = h(i);
- if (y <= 16) {
- p[i] = p[i] | ((1 << y) + (1 << (y + 1)) + (1 << (y + 2)) + (1 << (y + 3)));
- int dd = 0;
- d(4);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) p[j] = cp[j];
- }
- }
- for (int i = 0; i <= 6; i++) {
- int y = max(h(i), h(i + 1), h(i + 2), h(i + 3));
- if (y <= 19) {
- for (int j = 0; j < 4; j++) {
- p[i + j] = p[i + j] | (1 << (y));
- }
- int dd = 0;
- d(1);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) {
- p[j] = cp[j];
- }
- }
- }
- }
- else if (code[nr] == 'J') {
- for (int i = 0; i <= 8; i++) {
- int y = max(h(i), h(i + 1));
- if (y <= 17) {
- p[i + 1] = p[i + 1] | ((1 << y) + (1 << (y + 1)) + (1 << (y + 2)));
- p[i] = p[i] | (1 << y);
- int dd = 0;
- d(3);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) p[j] = cp[j];
- }
- }
- for (int i = 0; i <= 7; i++) {
- int y = max(h(i), h(i + 1), h(i + 2));
- if (y <= 18) {
- p[i] = p[i] | ((1 << y) + (1 << (y + 1)));
- p[i + 1] = p[i + 1] | (1 << y);
- p[i + 2] = p[i + 2] | (1 << y);
- int dd = 0;
- d(2);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) {
- p[j] = cp[j];
- }
- }
- }
- for (int i = 0; i <= 8; i++) {
- int y = max(h(i), h(i + 1) - 2);
- if (y <= 17) {
- p[i] = p[i] | ((1 << y) + (1 << (y + 1)) + (1 << (y + 2)));
- p[i + 1] = p[i + 1] | (1 << (y + 2));
- int dd = 0;
- d(3);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) p[j] = cp[j];
- }
- }
- for (int i = 0; i <= 7; i++) {
- int y = max(h(i) - 1, h(i + 1) - 1, h(i + 2));
- if (y <= 18) {
- p[i + 2] = p[i + 2] | ((1 << y) + (1 << (y + 1)));
- p[i + 1] = p[i + 1] | (1 << (y + 1));
- p[i] = p[i] | (1 << (y + 1));
- int dd = 0;
- d(2);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) {
- p[j] = cp[j];
- }
- }
- }
- }
- else if (code[nr] == 'L') {
- for (int i = 0; i <= 8; i++) {
- int y = max(h(i), h(i + 1));
- if (y <= 16) {
- p[i] = p[i] | ((1 << y) + (1 << (y + 1)) + (1 << (y + 2)));
- p[i + 1] = p[i + 1] | (1 << y);
- int dd = 0;
- d(3);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) p[j] = cp[j];
- }
- }
- for (int i = 0; i <= 7; i++) {
- int y = max(h(i), h(i + 1), h(i + 2));
- if (y <= 17) {
- p[i + 2] = p[i + 2] | ((1 << y) + (1 << (y + 1)));
- p[i + 1] = p[i + 1] | (1 << y);
- p[i] = p[i] | (1 << y);
- int dd = 0;
- d(2);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) {
- p[j] = cp[j];
- }
- }
- }
- for (int i = 0; i <= 8; i++) {
- int y = max(h(i) - 2, h(i + 1));
- if (y <= 17) {
- p[i + 1] = p[i + 1] | ((1 << y) + (1 << (y + 1)) + (1 << (y + 2)));
- p[i] = p[i] | (1 << (y + 2));
- int dd = 0;
- d(3);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) p[j] = cp[j];
- }
- }
- for (int i = 0; i <= 7; i++) {
- int y = max(h(i), h(i + 1) - 1, h(i + 2) - 1);
- if (y <= 18) {
- p[i] = p[i] | ((1 << y) + (1 << (y + 1)));
- p[i + 1] = p[i + 1] | (1 << (y + 1));
- p[i + 2] = p[i + 2] | (1 << (y + 1));
- int dd = 0;
- d(2);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) {
- p[j] = cp[j];
- }
- }
- }
- }
- else if (code[nr] == 'O') {
- for (int i = 0; i <= 8; i++) {
- int y = max(h(i), h(i + 1));
- if (y <= 18) {
- p[i] = p[i] | ((1 << y) + (1 << (y + 1)));
- p[i + 1] = p[i + 1] | ((1 << y) + (1 << (y + 1)));
- int dd = 0;
- d(2);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) {
- p[j] = cp[j];
- }
- }
- }
- }
- else if (code[nr] == 'S') {
- for (int i = 0; i <= 8; i++) {
- int y = max(h(i) - 1, h(i + 1));
- if (y <= 17) {
- p[i] = p[i] | ((1 << (y + 1)) + (1 << (y + 2)));
- p[i + 1] = p[i + 1] | ((1 << y) + (1 << (y + 1)));
- int dd = 0;
- d(3);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) p[j] = cp[j];
- }
- }
- for (int i = 0; i <= 7; i++) {
- int y = max(h(i), h(i + 1), h(i + 2) - 1);
- if (y <= 18) {
- p[i] = p[i] | (1 << y);
- p[i + 1] = p[i + 1] | ((1 << (y + 1)) + (1 << y));
- p[i + 2] = p[i + 2] | (1 << (y + 1));
- int dd = 0;
- d(2);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) {
- p[j] = cp[j];
- }
- }
- }
- }
- else if (code[nr] == 'T') {
- for (int i = 0; i <= 8; i++) {
- int y = max(h(i), h(i + 1) - 1);
- if (y <= 17) {
- p[i] = p[i] | ((1 << y) + (1 << (y + 1)) + (1 << (y + 2)));
- p[i + 1] = p[i + 1] | (1 << (y + 1));
- int dd = 0;
- d(3);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) p[j] = cp[j];
- }
- }
- for (int i = 0; i <= 8; i++) {
- int y = max(h(i) - 1, h(i + 1));
- if (y <= 17) {
- p[i + 1] = p[i + 1] | ((1 << y) + (1 << (y + 1)) + (1 << (y + 2)));
- p[i] = p[i] | (1 << (y + 1));
- int dd = 0;
- d(3);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) p[j] = cp[j];
- }
- }
- for (int i = 0; i <= 7; i++) {
- int y = max(h(i), h(i + 1), h(i + 2));
- if (y <= 18) {
- p[i + 2] = p[i + 2] | (1 << y);
- p[i + 1] = p[i + 1] | ((1 << y) + (1 << (y + 1)));
- p[i] = p[i] | (1 << y);
- int dd = 0;
- d(2);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) {
- p[j] = cp[j];
- }
- }
- }
- for (int i = 0; i <= 7; i++) {
- int y = max(h(i) - 1, h(i + 1), h(i + 2) - 1);
- if (y <= 18) {
- p[i + 2] = p[i + 2] | (1 << (y + 1));
- p[i + 1] = p[i + 1] | ((1 << y) + (1 << (y + 1)));
- p[i] = p[i] | (1 << (y + 1));
- int dd = 0;
- d(2);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) {
- p[j] = cp[j];
- }
- }
- }
- }
- else {
- for (int i = 0; i <= 8; i++) {
- int y = max(h(i), h(i + 1) - 1);
- if (y <= 17) {
- p[i] = p[i] | ((1 << y) + (1 << (y + 1)));
- p[i + 1] = p[i + 1] | ((1 << (y + 1)) + (1 << (y + 2)));
- int dd = 0;
- d(3);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) p[j] = cp[j];
- }
- }
- for (int i = 0; i <= 7; i++) {
- int y = max(h(i) - 1, h(i + 1), h(i + 2));
- if (y <= 18) {
- p[i] = p[i] | (1 << (y + 1));
- p[i + 1] = p[i + 1] | ((1 << (y + 1)) + (1 << y));
- p[i + 2] = p[i + 2] | (1 << y);
- int dd = 0;
- d(2);
- count = max(count, calccount(p, nr + 1, solution + dd));
- for (int j = 0; j < 10; j++) {
- p[j] = cp[j];
- }
- }
- }
- }
- return count;
- }
- int main() {
- for (int i = 0; i < 20; i++) {
- for (int j = 0; j < 10; j++) {
- char c;
- cin >> c;
- if (c != '.') {
- table[j] = (table[j] | (1 << (19 - i)));
- }
- }
- }
- cin >> code;
- int nr = 0, solution = 0;
- cout << calccount(table, 0, 0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement