P4205 [NOI2005] 智慧珠游戏
#include <bits/stdc++.h> using namespace std; const int maxr=55*12*8; const int maxn=68; const int maxnode=maxr*6; // DLX板子 struct DLX { int n,sz,S[maxn],row[maxnode],col[maxnode]; int L[maxnode],R[maxnode],U[maxnode],D[maxnode]; int ansd,ans[maxr]; void init(int n) { this->n=n; for(int i=0;i<=n;i++) { U[i]=i; D[i]=i; L[i]=i-1; R[i]=i+1; } R[n]=0; L[0]=n; sz=n+1; memset(S,0,sizeof(S)); } void addRow(int r,const vector<int> &columns) { int first=sz,c; for(int i=0;i<columns.size();i++) { c=columns[i]; L[sz]=sz-1; R[sz]=sz+1; D[sz]=c; U[sz]=U[c]; D[U[c]]=sz; U[c]=sz; row[sz]=r; col[sz]=c; S[c]++; sz++; } R[sz-1]=first; L[first]=sz-1; } #define FOR(i,A,s) for(int i=A[s];i!=s;i=A[i]) void remove(int c) { L[R[c]]=L[c]; R[L[c]]=R[c]; FOR(i,D,c) FOR(j,R,i) { U[D[j]]=U[j]; D[U[j]]=D[j]; S[col[j]]--; } } void restore(int c) { FOR(i,U,c) FOR(j,L,i) { S[col[j]]++; U[D[j]]=j; D[U[j]]=j; } L[R[c]]=c; R[L[c]]=c; } bool dfs(int d) { if(R[0]==0) { ansd=d; return true; } int c=R[0]; FOR(i,R,0) if(S[i]<S[c]) c=i; remove(c); FOR(i,D,c) { ans[d]=row[i]; FOR(j,R,i) remove(col[j]); if(dfs(d+1)) return true; FOR(j,L,i) restore(col[j]); } restore(c); return false; } bool solve(vector<int>& v) { v.clear(); if(!dfs(0)) return false; for(int i=0;i<ansd;i++) v.push_back(ans[i]); return true; } }solver; char ma[maxr][10][11]; // 记录在DLX中每一行对应的形状 char ans[10][11]; // 填充答案用的 int ha[10][10]; // 每一个格子代表在DLX中的第几列 bool vis[12]; // 记录哪些零件被用过 const int lr[12]={0,0,1,0,0,1,0,1,1,0,0,1}; // 左右翻转后是否跟旋转后相同,相同是1,不相同是0 const int t[12]={4,2,4,1,4,4,4,4,4,1,4,4}; // 4代表旋转180度和原先不同,2代表旋转180度和原先相同但旋转90度不同,1代表旋转90度相同 const int x[12][6]={ // 每个零件在一个平面直角坐标里对应哪些点,这个记录x坐标,-1结束。这个千万别打错。 {0,0,1,-1}, {0,1,2,3,-1}, {0,0,1,2,-1}, {0,0,1,1,-1}, {0,0,0,1,2,-1}, {0,1,1,2,3,-1}, {0,0,1,2,2,-1}, {0,0,1,1,2,-1}, {0,1,2,2,3,-1}, {0,1,1,1,2,-1}, {0,0,1,1,2,-1}, {0,0,1,2,3,-1}, }; const int y[12][6]={ // 这个记录y坐标,-1结束 {0,1,0,-1}, {0,0,0,0,-1}, {0,1,0,0,-1}, {0,1,0,1,-1}, {0,1,2,0,0,-1}, {0,0,1,0,0,-1}, {0,1,0,0,1,-1}, {0,1,0,1,0,-1}, {0,0,0,1,1,-1}, {1,0,1,2,1,-1}, {0,1,1,2,2,-1}, {0,1,0,0,0,-1}, }; inline void clear(int id) // 清空当前的形状 { register int i,j; for(i=0;i<10;i++) for(j=0;j<=i;j++) ma[id][i][j]='.'; } int main() { register int i,j,k,l,tot,cx,cy,tx,ty; vector<int> vec; solver.init(67); // 67列 for(i=0;i<10;i++) scanf("%s",ans[i]); for(i=0;i<12;i++) vis[i]=0; for(i=0;i<10;i++) for(j=0;j<=i;j++) if(ans[i][j]!='.') vis[ans[i][j]-'A']=1; for(i=0,tot=0;i<10;i++) { for(j=0;j<=i;j++) ha[i][j]=++tot; for(;j<10;j++) ha[i][j]=-1; } for(i=0,tot=1;i<12;i++) // 第几个零件 { for(j=-1;j<=lr[i];j+=2) // x的变化量是否乘以-1或1代表是否翻转,而lr[i]=0时只取一个 for(k=0;k<t[i];k++) // k=0表示不旋转,k=1时表示旋转90度(我不太清楚时顺时针还是逆时针,但不重要),k=2时表示旋转180度,k=3时表示旋转270度;t[i]=1时不旋转,t[i]=2时旋转不超过180度,t[i]=4时四种旋转都表示得到 for(cx=-5;cx<=15;cx++) for(cy=-5;cy<=cx+5;cy++) // 枚举零件一角 { clear(tot); for(l=0;x[i][l]>=0;l++) { if(k&1) // 旋转 { tx=cx+((k&2)?x[i][l]:-x[i][l])*j; ty=cy+((k&2)?y[i][l]:-y[i][l]); } else { tx=cx+((k&2)?y[i][l]:-y[i][l])*j; ty=cy+((k&2)?-x[i][l]:x[i][l]); } if(!(0<=ty && ty<=tx && tx<10)) break; if(vis[i] && ans[tx][ty]!=i+'A') break; // 已经确定的零件必须和图对应 if(!vis[i] && ans[tx][ty]!='.') break; // 没确定的零件要摆在空位上 ma[tot][tx][ty]=i+'A'; // 先记录下来 } if(x[i][l]<0) { vec.clear(); for(l=0;x[i][l]>=0;l++) { if(k&1) { tx=cx+((k&2)?x[i][l]:-x[i][l])*j; ty=cy+((k&2)?y[i][l]:-y[i][l]); } else { tx=cx+((k&2)?y[i][l]:-y[i][l])*j; ty=cy+((k&2)?-x[i][l]:x[i][l]); } vec.push_back(ha[tx][ty]); // 填了那些就把列设为1 } vec.push_back(i+56); // 还有每个零件对应的列 solver.addRow(tot++,vec); } } } if(!solver.solve(vec)) printf("No solution\n"); else // 填充答案 { for(i=0;i<vec.size();i++) for(j=0;j<10;j++) for(k=0;k<=j;k++) if(ma[vec[i]][j][k]!='.') ans[j][k]=ma[vec[i]][j][k]; for(i=0;i<10;i++) printf("%s\n",ans[i]); } return 0; }

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int gi(){ char x=getchar(); while(x!='.'&&(x>'Z'||x<'A')) x=getchar(); return x=='.'?0:(int)(x-'A'+1); } int a[16][16],ti; bool in[15]; char id(int x){ return (char)(x+'A'-1); } int get(){ for(int i=1;i<=10;i++){ for(int j=1;j<=i;j++) if(a[j][i]==0){ return j*100+i; } } } bool ok(){ for(int o=1;o<=12;o++) if(in[o]==false) return false; return true; } void init(){ memset(a,-1,sizeof(a)); memset(in,0,sizeof(in)); for(int i=1;i<=10;i++){ for(int j=1;j<=i;j++){ a[j][i]=gi(); in[a[j][i]]=true; } } } void print(){ for(int i=1;i<=10;i++){ for(int j=1;j<=i;j++){ cout<<id(a[j][i]); } cout<<endl; } } void dfs(int dep){ if(dep>=3000000){ printf("No solution"); exit(0); }//卡搜索次数 //可以玄学证明:如果有解那么深搜的最大次数不会超过3e6 if(ok()) { print(); exit(0); } int zt=get(); int px=zt/100; int py=zt%10; if(py==0) py=10; //A:4cases if(!in[1]){ if(a[px+1][py]==0&&a[px][py+1]==0){ a[px][py]=1; a[px+1][py]=1; a[px][py+1]=1; in[1]=true; dfs(dep+1); a[px][py]=0; a[px+1][py]=0; a[px][py+1]=0; in[1]=false; } if(a[px][py+1]==0&&a[px+1][py+1]==0){ a[px][py]=1; a[px][py+1]=1; a[px+1][py+1]=1; in[1]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px+1][py+1]=0; in[1]=false; } if(a[px][py+1]==0&&a[px-1][py+1]==0){ a[px][py]=1; a[px][py+1]=1; a[px-1][py+1]=1; in[1]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px-1][py+1]=0; in[1]=false; } if(a[px+1][py]==0&&a[px+1][py+1]==0){ a[px][py]=1; a[px+1][py]=1; a[px+1][py+1]=1; in[1]=true; dfs(dep+1); a[px][py]=0; a[px+1][py]=0; a[px+1][py+1]=0; in[1]=false; } } //B:2cases if(!in[2]){ if(a[px+1][py]==0&&a[px+2][py]==0&&a[px+3][py]==0){ a[px][py]=2; a[px+1][py]=2; a[px+2][py]=2; a[px+3][py]=2; in[2]=true; dfs(dep+1); a[px][py]=0; a[px+1][py]=0; a[px+2][py]=0; a[px+3][py]=0; in[2]=false; } if(a[px][py+1]==0&&a[px][py+2]==0&&a[px][py+3]==0){ a[px][py]=2; a[px][py+1]=2; a[px][py+2]=2; a[px][py+3]=2; in[2]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px][py+2]=0; a[px][py+3]=0; in[2]=false; } } //C:8cases if(!in[3]){ if(a[px+1][py]==0&&a[px+2][py]==0&&a[px][py+1]==0){ a[px][py]=3; a[px+1][py]=3; a[px+2][py]=3; a[px][py+1]=3; in[3]=true; dfs(dep+1); a[px][py]=0; a[px+1][py]=0; a[px+2][py]=0; a[px][py+1]=0; in[3]=false; } if(a[px+1][py]==0&&a[px+1][py+1]==0&&a[px+1][py+2]==0){ a[px][py]=3; a[px+1][py]=3; a[px+1][py+1]=3; a[px+1][py+2]=3; in[3]=true; dfs(dep+1); a[px][py]=0; a[px+1][py]=0; a[px+1][py+1]=0; a[px+1][py+2]=0; in[3]=false; } if(a[px+1][py]==0&&a[px][py+1]==0&&a[px][py+2]==0) { a[px][py]=3; a[px+1][py]=3; a[px][py+1]=3; a[px][py+2]=3; in[3]=true; dfs(dep+1); a[px][py]=0; a[px+1][py]=0; a[px][py+1]=0; a[px][py+2]=0; in[3]=false; } if(a[px+1][py]==0&&a[px+2][py]==0&&a[px+2][py+1]==0){ a[px][py]=3; a[px+2][py]=3; a[px+2][py+1]=3; a[px+1][py]=3; in[3]=true; dfs(dep+1); a[px][py]=0; a[px+2][py]=0; a[px+2][py+1]=0; a[px+1][py]=0; in[3]=false; } if(a[px+1][py+2]==0&&a[px][py+2]==0&&a[px][py+1]==0){ a[px][py]=3; a[px+1][py+2]=3; a[px][py+2]=3; a[px][py+1]=3; in[3]=true; dfs(dep+1); a[px][py]=0; a[px+1][py+2]=0; a[px][py+2]=0; a[px][py+1]=0; in[3]=false; } if(a[px-1][py+2]==0&&a[px][py+1]==0&&a[px][py+2]==0) { a[px][py]=3; a[px-1][py+2]=3; a[px][py+1]=3; a[px][py+2]=3; in[3]=true; dfs(dep+1); a[px][py]=0; a[px-1][py+2]=0; a[px][py+1]=0; a[px][py+2]=0; in[3]=false; } if(a[px][py+1]==0&&a[px+1][py+1]==0&&a[px+2][py+1]==0){ a[px][py]=3; a[px][py+1]=3; a[px+1][py+1]=3; a[px+2][py+1]=3; in[3]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px+1][py+1]=0; a[px+2][py+1]=0; in[3]=false; } if(a[px][py+1]==0&&a[px-1][py+1]==0&&a[px-2][py+1]==0){ a[px][py]=3; a[px][py+1]=3; a[px-1][py+1]=3; a[px-2][py+1]=3; in[3]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px-1][py+1]=0; a[px-2][py+1]=0; in[3]=false; } } //D:1case if(!in[4]){ if(a[px][py+1]==0&&a[px+1][py+1]==0&&a[px+1][py]==0){ a[px][py]=4; a[px][py+1]=4; a[px+1][py+1]=4; a[px+1][py]=4; in[4]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px+1][py+1]=0; a[px+1][py]=0; in[4]=false; } } //E:4cases if(!in[5]){ if(a[px+1][py]==0&&a[px+2][py]==0&&a[px][py+1]==0&&a[px][py+2]==0) { a[px][py]=5; a[px+1][py]=5; a[px+2][py]=5; a[px][py+1]=5; a[px][py+2]=5; in[5]=true; dfs(dep+1); a[px][py]=0; a[px+1][py]=0; a[px+2][py]=0; a[px][py+1]=0; a[px][py+2]=0; in[5]=false; } if(a[px+1][py]==0&&a[px+2][py]==0&&a[px][py-1]==0&&a[px][py-2]==0) { a[px][py]=5; a[px+1][py]=5; a[px+2][py]=5; a[px][py-1]=5; a[px][py-2]=5; in[5]=true; dfs(dep+1); a[px][py]=0; a[px+1][py]=0; a[px+2][py]=0; a[px][py-1]=0; a[px][py-2]=0; in[5]=false; } if(a[px][py+1]==0&&a[px][py+2]==0&&a[px+1][py+2]==0&&a[px+2][py+2]==0){ a[px][py]=5; a[px][py+1]=5; a[px][py+2]=5; a[px+1][py+2]=5; a[px+2][py+2]=5; in[5]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px][py+2]=0; a[px+1][py+2]=0; a[px+2][py+2]=0; in[5]=false; } if(a[px][py+1]==0&&a[px][py+2]==0&&a[px-1][py+2]==0&&a[px-2][py+2]==0){ a[px][py]=5; a[px][py+1]=5; a[px][py+2]=5; a[px-1][py+2]=5; a[px-2][py+2]=5; in[5]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px][py+2]=0; a[px-1][py+2]=0; a[px-2][py+2]=0; in[5]=false; } } //F:8cases if(!in[6]){ if(a[px-1][py+1]==0&&a[px][py+1]==0&&a[px+1][py+1]==0&&a[px+2][py+1]==0){ a[px][py]=6; a[px-1][py+1]=6; a[px][py+1]=6; a[px+1][py+1]=6; a[px+2][py+1]=6; in[6]=true; dfs(dep+1); a[px][py]=0; a[px-1][py+1]=0; a[px][py+1]=0; a[px+1][py+1]=0; a[px+2][py+1]=0; in[6]=false; } if(a[px-1][py+1]==0&&a[px][py+1]==0&&a[px+1][py+1]==0&&a[px-2][py+1]==0) { a[px][py]=6; a[px-1][py+1]=6; a[px][py+1]=6; a[px+1][py+1]=6; a[px-2][py+1]=6; in[6]=true; dfs(dep+1); a[px][py]=0; a[px-1][py+1]=0; a[px][py+1]=0; a[px+1][py+1]=0; a[px-2][py+1]=0; in[6]=false; } if(a[px+1][py+1]==0&&a[px+1][py]==0&&a[px+2][py]==0&&a[px+3][py]==0) { a[px][py]=6; a[px+1][py+1]=6; a[px+1][py]=6; a[px+2][py]=6; a[px+3][py]=6; in[6]=true; dfs(dep+1); a[px][py]=0; a[px+1][py+1]=0; a[px+1][py]=0; a[px+2][py]=0; a[px+3][py]=0; in[6]=false; } if(a[px+1][py]==0&&a[px+2][py+1]==0&&a[px+2][py]==0&&a[px+3][py]==0) { a[px][py]=6; a[px+1][py]=6; a[px+2][py+1]=6; a[px+2][py]=6; a[px+3][py]=6; in[6]=true; dfs(dep+1); a[px][py]=0; a[px+1][py]=0; a[px+2][py+1]=0; a[px+2][py]=0; a[px+3][py]=0; in[6]=false; } if(a[px][py+1]==0&&a[px][py+2]==0&&a[px][py+3]==0&&a[px+1][py+1]==0){ a[px][py]=6; a[px][py+1]=6; a[px][py+2]=6; a[px][py+3]=6; a[px+1][py+1]=6; in[6]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px][py+2]=0; a[px][py+3]=0; a[px+1][py+1]=0; in[6]=false; } if(a[px][py+1]==0&&a[px][py+2]==0&&a[px][py+3]==0&&a[px-1][py+1]==0) { a[px][py]=6; a[px][py+1]=6; a[px][py+2]=6; a[px][py+3]=6; a[px-1][py+1]=6; in[6]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px][py+2]=0; a[px][py+3]=0; a[px-1][py+1]=0; in[6]=false; } if(a[px][py+1]==0&&a[px][py+2]==0&&a[px][py+3]==0&&a[px+1][py+2]==0) { a[px][py]=6; a[px][py+1]=6; a[px][py+2]=6; a[px][py+3]=6; a[px+1][py+2]=6; in[6]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px][py+2]=0; a[px][py+3]=0; a[px+1][py+2]=0; in[6]=false; } if(a[px][py+1]==0&&a[px][py+2]==0&&a[px][py+3]==0&&a[px-1][py+2]==0) { a[px][py]=6; a[px][py+1]=6; a[px][py+2]=6; a[px][py+3]=6; a[px-1][py+2]=6; in[6]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px][py+2]=0; a[px][py+3]=0; a[px-1][py+2]=0; in[6]=false; } } //G:4cases if(!in[7]){ if(a[px][py+1]==0&&a[px+1][py]==0&&a[px+2][py+1]==0&&a[px+2][py]==0) { a[px][py]=7; a[px][py+1]=7; a[px+1][py]=7; a[px+2][py+1]=7; a[px+2][py]=7; in[7]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px+1][py]=0; a[px+2][py+1]=0; a[px+2][py]=0; in[7]=false; } if(a[px][py+1]==0&&a[px+1][py+1]==0&&a[px+2][py+1]==0&&a[px+2][py]==0) { a[px][py]=7; a[px][py+1]=7; a[px+1][py+1]=7; a[px+2][py+1]=7; a[px+2][py]=7; in[7]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px+1][py+1]=0; a[px+2][py+1]=0; a[px+2][py]=0; in[7]=false; } if(a[px][py+1]==0&&a[px][py+2]==0&&a[px+1][py+2]==0&&a[px+1][py]==0) { a[px][py]=7; a[px][py+1]=7; a[px][py+2]=7; a[px+1][py+2]=7; a[px+1][py]=7; in[7]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px][py+2]=0; a[px+1][py+2]=0; a[px+1][py]=0; in[7]=false; } if(a[px+1][py]==0&&a[px+1][py+1]==0&&a[px+1][py+2]==0&&a[px][py+2]==0) { a[px][py]=7; a[px+1][py]=7; a[px+1][py+1]=7; a[px+1][py+2]=7; a[px][py+2]=7; in[7]=true; dfs(dep+1); a[px][py]=0; a[px+1][py]=0; a[px+1][py+1]=0; a[px+1][py+2]=0; a[px][py+2]=0; in[7]=false; } } //H:8cases if(!in[8]){ if(a[px+1][py]==0&&a[px+1][py+1]==0&&a[px+2][py]==0&&a[px+2][py+1]==0) { a[px][py]=8; a[px+1][py]=8; a[px+1][py+1]=8; a[px+2][py]=8; a[px+2][py+1]=8; in[8]=true; dfs(dep+1); a[px][py]=0; a[px+1][py]=0; a[px+1][py+1]=0; a[px+2][py]=0; a[px+2][py+1]=0; in[8]=false; } if(a[px-1][py+1]==0&&a[px][py+1]==0&&a[px+1][py+1]==0&&a[px+1][py]==0) { a[px][py]=8; a[px-1][py+1]=8; a[px][py+1]=8; a[px+1][py+1]=8; a[px+1][py]=8; in[8]=true; dfs(dep+1); a[px][py]=0; a[px-1][py+1]=0; a[px][py+1]=0; a[px+1][py+1]=0; a[px+1][py]=0; in[8]=false; } if(a[px][py+1]==0&&a[px+1][py]==0&&a[px+1][py+1]==0&&a[px+2][py+1]==0) { a[px][py]=8; a[px+1][py]=8; a[px][py+1]=8; a[px+1][py+1]=8; a[px+2][py+1]=8; in[8]=true; dfs(dep+1); a[px][py]=0; a[px+1][py]=0; a[px][py+1]=0; a[px+1][py+1]=0; a[px+2][py+1]=0; in[8]=false; } if(a[px+1][py]==0&&a[px+2][py]==0&&a[px][py+1]==0&&a[px+1][py+1]==0){ a[px][py]=8; a[px+1][py]=8; a[px+2][py]=8; a[px][py+1]=8; a[px+1][py+1]=8; in[8]=true; dfs(dep+1); a[px][py]=0; a[px+1][py]=0; a[px+2][py]=0; a[px][py+1]=0; a[px+1][py+1]=0; in[8]=false; } if(a[px][py+1]==0&&a[px][py+2]==0&&a[px+1][py+1]==0&&a[px+1][py+2]==0) { a[px][py]=8; a[px][py+1]=8; a[px][py+2]=8; a[px+1][py+1]=8; a[px+1][py+2]=8; in[8]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px][py+2]=0; a[px+1][py+1]=0; a[px+1][py+2]=0; in[8]=false; } if(a[px][py+1]==0&&a[px][py+2]==0&&a[px-1][py+1]==0&&a[px-1][py+2]==0){ a[px][py]=8; a[px][py+1]=8; a[px][py+2]=8; a[px-1][py+1]=8; a[px-1][py+2]=8; in[8]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px][py+2]=0; a[px-1][py+1]=0; a[px-1][py+2]=0; in[8]=false; } if(a[px][py+1]==0&&a[px][py+2]==0&&a[px+1][py]==0&&a[px+1][py+1]==0) { a[px][py]=8; a[px][py+1]=8; a[px][py+2]=8; a[px+1][py]=8; a[px+1][py+1]=8; in[8]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px][py+2]=0; a[px+1][py]=0; a[px+1][py+1]=0; in[8]=false; } if(a[px][py+1]==0&&a[px+1][py+2]==0&&a[px+1][py+1]==0&&a[px+1][py]==0){ a[px][py]=8; a[px][py+1]=8; a[px+1][py+2]=8; a[px+1][py+1]=8; a[px+1][py]=8; in[8]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px+1][py+2]=0; a[px+1][py+1]=0; a[px+1][py]=0; in[8]=false; } } //I:8cases if(!in[9]){ if(a[px+1][py]==0&&a[px+2][py]==0&&a[px+2][py+1]==0&&a[px+3][py+1]==0){ a[px][py]=9; a[px+1][py]=9; a[px+2][py]=9; a[px+2][py+1]=9; a[px+3][py+1]=9; in[9]=true; dfs(dep+1); a[px][py]=0; a[px+1][py]=0; a[px+2][py]=0; a[px+2][py+1]=0; a[px+3][py+1]=0; in[9]=false; } if(a[px-2][py+1]==0&&a[px-1][py+1]==0&&a[px][py+1]==0&&a[px+1][py]==0) { a[px][py]=9; a[px-2][py+1]=9; a[px-1][py+1]=9; a[px][py+1]=9; a[px+1][py]=9; in[9]=true; dfs(dep+1); a[px][py]=0; a[px-2][py+1]=0; a[px-1][py+1]=0; a[px][py+1]=0; a[px+1][py]=0; in[9]=false; } if(a[px+1][py]==0&&a[px+1][py+1]==0&&a[px+2][py+1]==0&&a[px+3][py+1]==0){ a[px][py]=9; a[px+1][py]=9; a[px+1][py+1]=9; a[px+2][py+1]=9; a[px+3][py+1]=9; in[9]=true; dfs(dep+1); a[px][py]=0; a[px+1][py]=0; a[px+1][py+1]=0; a[px+2][py+1]=0; a[px+3][py+1]=0; in[9]=false; } if(a[px][py+1]==0&&a[px-1][py+1]==0&&a[px-2][py+1]==0&&a[px+1][py]==0){ a[px][py]=9; a[px][py+1]=9; a[px-1][py+1]=9; a[px-2][py+1]=9; a[px+1][py]=9; in[9]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px-1][py+1]=0; a[px-2][py+1]=0; a[px+1][py]=0; in[9]=false; } if(a[px][py+1]==0&&a[px+1][py+1]==0&&a[px+1][py+3]==0&&a[px+1][py+2]==0){ a[px][py]=9; a[px][py+1]=9; a[px+1][py+1]=9; a[px+1][py+3]=9; a[px+1][py+2]=9; in[9]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px+1][py+1]=0; a[px+1][py+3]=0; a[px+1][py+2]=0; in[9]=false; } if(a[px][py+1]==0&&a[px-1][py+1]==0&&a[px-1][py+3]==0&&a[px-1][py+2]==0){ a[px][py]=9; a[px][py+1]=9; a[px-1][py+1]=9; a[px-1][py+3]=9; a[px-1][py+2]=9; in[9]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px-1][py+1]=0; a[px-1][py+3]=0; a[px-1][py+2]=0; in[9]=false; } if(a[px][py+1]==0&&a[px][py+2]==0&&a[px+1][py+2]==0&&a[px+1][py+3]==0) { a[px][py]=9; a[px][py+1]=9; a[px][py+2]=9; a[px+1][py+2]=9; a[px+1][py+3]=9; in[9]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px][py+2]=0; a[px+1][py+2]=0; a[px+1][py+3]=0; in[9]=false; } if(a[px][py+1]==0&&a[px][py+2]==0&&a[px-1][py+2]==0&&a[px-1][py+3]==0) { a[px][py]=9; a[px][py+1]=9; a[px][py+2]=9; a[px-1][py+2]=9; a[px-1][py+3]=9; in[9]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px][py+2]=0; a[px-1][py+2]=0; a[px-1][py+3]=0; in[9]=false; } } //J:1case if(!in[10]){ if(a[px][py+1]==0&&a[px][py+2]==0&&a[px-1][py+1]==0&&a[px+1][py+1]==0) { a[px][py]=10; a[px][py+1]=10; a[px][py+2]=10; a[px-1][py+1]=10; a[px+1][py+1]=10; in[10]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px][py+2]=0; a[px-1][py+1]=0; a[px+1][py+1]=0; in[10]=false; } } //K:4cases if(!in[11]){ if(a[px][py+1]==0&&a[px+1][py+1]==0&&a[px+1][py+2]==0&&a[px+2][py+2]==0) { a[px][py]=11; a[px][py+1]=11; a[px+1][py+1]=11; a[px+1][py+2]=11; a[px+2][py+2]=11; in[11]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px+1][py+1]=0; a[px+1][py+2]=0; a[px+2][py+2]=0; in[11]=false; } if(a[px][py+1]==0&&a[px-1][py+1]==0&&a[px-1][py+2]==0&&a[px-2][py+2]==0) { a[px][py]=11; a[px][py+1]=11; a[px-1][py+1]=11; a[px-1][py+2]=11; a[px-2][py+2]=11; in[11]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px-1][py+1]=0; a[px-1][py+2]=0; a[px-2][py+2]=0; in[11]=false; } if(a[px+1][py]==0&&a[px+1][py+1]==0&&a[px+2][py+1]==0&&a[px+2][py+2]==0){ a[px][py]=11; a[px+1][py]=11; a[px+1][py+1]=11; a[px+2][py+1]=11; a[px+2][py+2]=11; in[11]=true; dfs(dep+1); a[px][py]=0; a[px+1][py]=0; a[px+1][py+1]=0; a[px+2][py+1]=0; a[px+2][py+2]=0; in[11]=false; } if(a[px+1][py]==0&&a[px][py+1]==0&&a[px-1][py+1]==0&&a[px-1][py+2]==0){ a[px][py]=11; a[px][py+1]=11; a[px+1][py]=11; a[px-1][py+1]=11; a[px-1][py+2]=11; in[11]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px+1][py]=0; a[px-1][py+1]=0; a[px-1][py+2]=0; in[11]=false; } } //L:8cases if(!in[12]){ if(a[px][py+1]==0&&a[px+1][py]==0&&a[px+2][py]==0&&a[px+3][py]==0) { a[px][py]=12; a[px][py+1]=12; a[px+1][py]=12; a[px+2][py]=12; a[px+3][py]=12; in[12]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px+1][py]=0; a[px+2][py]=0; a[px+3][py]=0; in[12]=false; } if(a[px+3][py+1]==0&&a[px+1][py]==0&&a[px+2][py]==0&&a[px+3][py]==0){ a[px][py]=12; a[px+3][py+1]=12; a[px+1][py]=12; a[px+2][py]=12; a[px+3][py]=12; in[12]=true; dfs(dep+1); a[px][py]=0; a[px+3][py+1]=0; a[px+1][py]=0; a[px+2][py]=0; a[px+3][py]=0; in[12]=false; } if(a[px][py+1]==0&&a[px+1][py+1]==0&&a[px+2][py+1]==0&&a[px+3][py+1]==0){ a[px][py]=12; a[px][py+1]=12; a[px+1][py+1]=12; a[px+2][py+1]=12; a[px+3][py+1]=12; in[12]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px+1][py+1]=0; a[px+2][py+1]=0; a[px+3][py+1]=0; in[12]=false; } if(a[px][py+1]==0&&a[px-1][py+1]==0&&a[px-2][py+1]==0&&a[px-3][py+1]==0){ a[px][py]=12; a[px][py+1]=12; a[px-1][py+1]=12; a[px-2][py+1]=12; a[px-3][py+1]=12; in[12]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px-1][py+1]=0; a[px-2][py+1]=0; a[px-3][py+1]=0; in[12]=false; } if(a[px+1][py]==0&&a[px+1][py+1]==0&&a[px+1][py+2]==0&&a[px+1][py+3]==0) { a[px][py]=12; a[px+1][py]=12; a[px+1][py+1]=12; a[px+1][py+2]=12; a[px+1][py+3]=12; in[12]=true; dfs(dep+1); a[px][py]=0; a[px+1][py]=0; a[px+1][py+1]=0; a[px+1][py+2]=0; a[px+1][py+3]=0; in[12]=false; } if(a[px+1][py]==0&&a[px][py+1]==0&&a[px][py+2]==0&&a[px][py+3]==0){ a[px][py]=12; a[px][py+1]=12; a[px+1][py]=12; a[px][py+2]=12; a[px][py+3]=12; in[12]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px+1][py]=0; a[px][py+2]=0; a[px][py+3]=0; in[12]=false; } if(a[px][py+1]==0&&a[px][py+2]==0&&a[px][py+3]==0&&a[px+1][py+3]==0) { a[px][py]=12; a[px][py+1]=12; a[px][py+2]=12; a[px][py+3]=12; a[px+1][py+3]=12; in[12]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px][py+2]=0; a[px][py+3]=0; a[px+1][py+3]=0; in[12]=false; } if(a[px][py+1]==0&&a[px][py+2]==0&&a[px][py+3]==0&&a[px-1][py+3]==0) { a[px][py]=12; a[px][py+1]=12; a[px][py+2]=12; a[px][py+3]=12; a[px-1][py+3]=12; in[12]=true; dfs(dep+1); a[px][py]=0; a[px][py+1]=0; a[px][py+2]=0; a[px][py+3]=0; a[px-1][py+3]=0; in[12]=false; } } } void openfile(){ freopen("game.in","r",stdin); freopen("game.out","w",stdout); } int main(){ //openfile(); init(); dfs(1); printf("No solution"); return 0; }