#include #include #include #include using namespace std; int n,a,b,c,d,e,f,x,y; bool m[30][30], m1[30][30]; vector> r; const int calc = 1e4+7; time_t start; pair>> solve(int idx, int cnt, vector> p) { vector> p1 = p, mxp; if(idx == r.size()-1) return {cnt, p}; int mx = cnt; int num = r[idx].first, rot = r[idx].second; bool br1 = 0; for(int x = 0; x < n; x++) { for(int y = 0; y < n; y++) { m1[x][y]=m[x][y]; } } for(int x = 0; x < n; x++) { bool is = 1; for(int y = 0; y < n; y++) { is &=m1[x][y]; } if(is) { for(int y = 0; y < n; y++) { m[x][y]=0; } } } for(int y = 0; y < n; y++) { bool is = 1; for(int x = 0; x < n; x++) { is &= m1[x][y]; } if(is) { for(int x = 0; x < n; x++) { m[x][y]=0; } } } for(int x = 0; x < n; x++) ////////////////////////////////////////////////////////// popravi for(int y = 0; y < n; y++) { bool br=0; if(num == 0) { /* -- -a */ if(rot == 0) { if(x-1<0 || y-1<0) continue; if(m[x][y] || m[x-1][y] || m[x][y-1] || m[x-1][y-1]) continue; m[x][y]=1, m[x-1][y]=1, m[x][y-1]=1, m[x-1][y-1]=1; br=1; } else if(rot == 1) { //y- x+ if(x+1>=n || y-1<0) continue; if(m[x][y] || m[x+1][y] || m[x][y-1] || m[x+1][y-1]) continue; m[x][y]=1, m[x+1][y]=1, m[x][y-1]=1, m[x+1][y-1]=1; br=1; } else if(rot == 2) { //y+ x+ if(x+1>=n || y+1>=n) continue; if(m[x][y] || m[x+1][y] || m[x][y+1] || m[x+1][y+1]) continue; m[x][y]=1, m[x+1][y]=1, m[x][y+1]=1, m[x+1][y+1]=1; br=1; } else if(rot == 3) { //x- y+ if(x-1<0 || y+1>=n) continue; if(m[x][y] || m[x-1][y] || m[x][y+1] || m[x-1][y+1]) continue; m[x][y]=1, m[x-1][y]=1, m[x][y+1]=1, m[x-1][y+1]=1; br=1; } } else if(num == 1) { /* - -a */ if(rot == 0) { if(x-1<0 || y-1<0) continue; if(m[x][y] || m[x-1][y] || m[x][y-1]) continue; m[x][y]=1, m[x-1][y]=1, m[x][y-1]=1; br=1; } else if(rot == 1) { //y- x+ if(x+1>=n || y-1<0) continue; if(m[x][y] || m[x+1][y] || m[x][y-1]) continue; m[x][y]=1, m[x+1][y]=1, m[x][y-1]=1; br=1; } else if(rot == 2) { //y+ x+ if(x+1>=n || y+1>=n) continue; if(m[x][y] || m[x+1][y] || m[x][y+1]) continue; m[x][y]=1, m[x+1][y]=1, m[x][y+1]=1; br=1; } else if(rot == 3) { //x- y+ if(x-1<0 || y+1>=n) continue; if(m[x][y] || m[x-1][y] || m[x][y+1]) continue; m[x][y]=1, m[x-1][y]=1, m[x][y+1]=1; br=1; } } else if(num == 2) { /* - --a */ if(rot == 0) { if(x-2<0 || y-1<0) continue; if(m[x][y] || m[x-1][y] || m[x][y-1] || m[x-2][y]) continue; m[x][y]=1, m[x-1][y]=1, m[x][y-1]=1, m[x-2][y]=1; br=1; } else if(rot == 1) { //y- x+ if(x+1>=n || y-2<0) continue; if(m[x][y] || m[x+1][y] || m[x][y-1] || m[x][y-2]) continue; m[x][y]=1, m[x+1][y]=1, m[x][y-1]=1, m[x][y-2]=1; br=1; } else if(rot == 2) { //y+ x+ if(x+2>=n || y+1>=n) continue; if(m[x][y] || m[x+1][y] || m[x][y+1] || m[x+2][y]) continue; m[x][y]=1, m[x+1][y]=1, m[x][y+1]=1, m[x+2][y]=1; br=1; } else if(rot == 3) { //x- y+ if(x-1<0 || y+2>=n) continue; if(m[x][y] || m[x-1][y] || m[x][y+1] || m[x][y+2]) continue; m[x][y]=1, m[x-1][y]=1, m[x][y+1]=1, m[x][y+2]=1; br=1; } } else if(num == 3) { // ---a if(rot == 0) { if(x-3<0) continue; for(int i = 3; i >= 0; i--) { if(m[x-i][y]) continue; m[x-i][y]=1; } br=1; } else if(rot == 1) { if(y-3<0) continue; for(int i = 3; i >= 0; i--) { if(m[x][y-i]) continue; m[x][y-i]=1; } br=1; } else if(rot == 2) { if(x+3>=n) continue; for(int i = 3; i >= 0; i--) { if(m[x+i][y]) continue; m[x+i][y]=1; } br=1; } else if(rot == 3) { if(y+3>=n) continue; for(int i = 3; i >= 0; i--) { if(m[x][y+i]) continue; m[x][y+i]=1; } br=1; } } else if(num == 4) { /* - -- a */ if(rot == 0) { if(x-1<0 || y-2<0) continue; if(m[x][y] || m[x-1][y-1] || m[x][y-1] || m[x][y-2]) continue; m[x][y]=1, m[x-1][y-1]=1, m[x][y-1]=1, m[x][y-2]=1; br=1; } else if(rot == 1) { if(x+2>=n || y-1<0) continue; if(m[x][y] || m[x+1][y] || m[x+2][y] || m[x+1][y-1]) continue; m[x][y]=1, m[x+1][y]=1, m[x+2][y]=1, m[x+1][y-1]=1; br=1; } else if(rot == 2) { if(x+1>=n || y+2>=n) continue; if(m[x][y] || m[x+1][y+1] || m[x][y+1] || m[x][y+2]) continue; m[x][y]=1, m[x+1][y+1]=1, m[x][y+1]=1, m[x][y+2]=1; br=1; } else if(rot == 3) { if(x-2<0 || y+1>=n) continue; if(m[x][y] || m[x-1][y] || m[x-2][y] || m[x-1][y+1]) continue; m[x][y]=1, m[x-1][y]=1, m[x-2][y]=1, m[x-1][y+1]=1; br=1; } } p1 = p; p1.push_back({x+1, y+1}); if(br) { auto z = solve(idx+1, cnt+1, p1); if(z.first > mx) { mx = z.first; mxp = z.second; } } br1 |= br; if(num == 0) { /* -- -a */ if(rot == 0) { m[x][y]=0, m[x-1][y]=0, m[x][y-1]=0, m[x-1][y-1]=0; br=1; } else if(rot == 1) { m[x][y]=0, m[x+1][y]=0, m[x][y-1]=0, m[x+1][y-1]=0; br=1; } else if(rot == 2) { m[x][y]=0, m[x+1][y]=0, m[x][y+1]=0, m[x+1][y+1]=0; br=1; } else if(rot == 3) { m[x][y]=0, m[x-1][y]=0, m[x][y+1]=0, m[x-1][y+1]=0; br=1; } } else if(num == 1) { /* - -a */ if(rot == 0) { m[x][y]=0, m[x-1][y]=0, m[x][y-1]=0; br=1; } else if(rot == 1) { m[x][y]=0, m[x+1][y]=0, m[x][y-1]=0; br=1; } else if(rot == 2) { m[x][y]=0, m[x+1][y]=0, m[x][y+1]=0; br=1; } else if(rot == 3) { m[x][y]=0, m[x-1][y]=0, m[x][y+1]=0; br=1; } } else if(num == 2) { /* - --a */ if(rot == 0) { m[x][y]=0, m[x-1][y]=0, m[x][y-1]=0, m[x-2][y]=0; br=1; } else if(rot == 1) { m[x][y]=0, m[x+1][y]=0, m[x][y-1]=0, m[x][y-2]=0; br=1; } else if(rot == 2) { m[x][y]=0, m[x+1][y]=0, m[x][y+1]=0, m[x+2][y]=0; br=1; } else if(rot == 3) { m[x][y]=0, m[x-1][y]=0, m[x][y+1]=0, m[x][y+2]=0; br=1; } } else if(num == 3) { // ---a if(rot == 0) { for(int i = 3; i >= 0; i--) { m[x-i][y]=0; } br=1; } else if(rot == 1) { for(int i = 3; i >= 0; i--) { m[x][y-i]=0; } br=1; } else if(rot == 2) { for(int i = 3; i >= 0; i--) { m[x+i][y]=1; } br=0; } else if(rot == 3) { for(int i = 3; i >= 0; i--) { m[x][y+i]=0; } br=1; } } else if(num == 4) { /* - -- a */ if(rot == 0) { m[x][y]=0, m[x-1][y-1]=0, m[x][y-1]=0, m[x][y-2]=0; } else if(rot == 1) { m[x][y]=0, m[x+1][y]=0, m[x+2][y]=0, m[x+1][y-1]=0; br=1; } else if(rot == 2) { m[x][y]=0, m[x+1][y+1]=0, m[x][y+1]=0, m[x][y+2]=0; br=1; } else if(rot == 3) { m[x][y]=0, m[x-1][y]=0, m[x-2][y]=0, m[x-1][y+1]=0; br=1; } } } for(int x = 0; x < n; x++) { for(int y = 0; y < n; y++) { m[x][y]=m1[x][y]; } } return {mx, mxp}; } int main() { #ifdef ONLINE_JUDGE freopen("block.in", "r", stdin); freopen("block.out", "w", stdout); #endif cout<<0; }