文件太长,传送门
大爆搜。。。→ _→ ....考试时被卡死了。。
搜每一种状态,因为状态太少,不会爆
要判断下落,然后能否消,再判断下落,直到不能再消。。
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> using namespace std; int n,ans[10][10]; struct node { int h[10][10]; } a; int check(node &x) { int zz=1,v[10][10]; while(zz) { zz=0; memset(v,0,sizeof(v)); for(int i=0;i<5;i++) for(int j=0;j<7;j++) { if(x.h[i][j]!=0&&x.h[i][j]==x.h[i+2][j]&&x.h[i][j]==x.h[i+1][j]) { v[i][j]=v[i+2][j]=v[i+1][j]=1; } if(x.h[i][j]!=0&&x.h[i][j]==x.h[i][j+2]&&x.h[i][j]==x.h[i][j+1]) { v[i][j]=v[i][j+2]=v[i][j+1]=1; } } for(int i=4;i>=0;i--) for(int j=6;j>=0;j--) if(v[i][j]) x.h[i][j]=0; for(int i=4;i>=0;i--) for(int j=1;j<=6;j++) { int p=j; while(x.h[i][p]&&!x.h[i][p-1]&&p) x.h[i][p-1]=x.h[i][p],x.h[i][p]=0,p--; } for(int i=0;i<5;i++) for(int j=0;j<7;j++) { if(x.h[i][j]!=0&&x.h[i][j]==x.h[i+2][j]&&x.h[i][j]==x.h[i+1][j]) { v[i][j]=v[i+2][j]=v[i+1][j]=1; zz=1; } if(x.h[i][j]!=0&&x.h[i][j]==x.h[i][j+2]&&x.h[i][j]==x.h[i][j+1]) { v[i][j]=v[i][j+2]=v[i][j+1]=1; zz=1; } } } for(int i=0;i<5;i++) for(int j=0;j<7;j++) if(x.h[i][j]!=0){ return 0; } return 1; } int dfs(int x,int y,int dir,int len,node zz) { if(check(zz)&&len==n) { ans[n][1]=x,ans[n][2]=y;ans[n][3]=dir; return 1; } else if(len==n)return 0; node b=zz; for(int i=0;i<5;i++) for(int j=0;j<7;j++) { if(!zz.h[i][j])break; if(i<4) { swap(b.h[i][j],b.h[i+1][j]); if(dfs(i,j,1,len+1,b)) { ans[len][1]=x;ans[len][2]=y;ans[len][3]=dir; return 1; } } b=zz; if(i&&zz.h[i-1][j]) continue; if(i>0) { swap(b.h[i][j],b.h[i-1][j]); if(dfs(i,j,-1,len+1,b)) { ans[len][1]=x;ans[len][2]=y;ans[len][3]=dir; return 1; } } b=zz; } return 0; } int yjn() { //freopen("mayan.in","r",stdin); //freopen("mayan.out","w",stdout); scanf("%d",&n); int p=0; for(int i=0;i<5;i++) { int x,y=0; while(1) { scanf("%d",&x); if(x==0)break; a.h[i][y]=x; y++; } } if(dfs(0,0,0,0,a)) for(int i=1;i<=n;i++) printf("%d %d %d ",ans[i][1],ans[i][2],ans[i][3]); else printf("-1"); } int qty=yjn(); int main(){;}