深搜+模拟
需要剪枝:同一移动向右移了就不需要向左移了
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> using namespace std; int n,bo[6][8],tot,a[6][6][8],b[6][3]; bool boo; int print(int x){ printf(" "); for(int i=0;i<5;i++){ for(int j=0;j<7;j++) printf("%d ",a[x][i][j]); printf(" "); } printf(" "); return 0; } bool boooo[5]={0}; void fall(int step){ for(int i=0;i<5;i++){ int bottom=0; while(a[step][i][bottom]) bottom++; if(bottom>=7) continue; for(int j=bottom;j<7;j++){ if(a[step][i][j]){ a[step][i][bottom++]=a[step][i][j]; a[step][i][j]=0; } } } } bool wipe(int step){ boo=0; tot++; for(int i=0;i<5;i++) for(int j=2;j<7;j++){ if(!a[step][i][j]) break; if(a[step][i][j]==a[step][i][j-1]&&a[step][i][j]==a[step][i][j-2]) bo[i][j]=bo[i][j-1]=bo[i][j-2]=tot; } for(int i=0;i<7;i++) for(int j=2;j<5;j++){ if(!a[step][j][i]) break; if(a[step][j][i]==a[step][j-1][i]&&a[step][j][i]==a[step][j-2][i]) bo[j][i]=bo[j-1][i]=bo[j-2][i]=tot; } for(int i=0;i<5;i++) for(int j=0;j<7;j++) if(bo[i][j]==tot){ a[step][i][j]=0; boo=1; } return boo; } void move(int step,int x,int y,int pos){ swap(a[step][x][y],a[step][x+pos][y]); fall(step); while(wipe(step)==1) fall(step); } void dfs(int step,int x,int y,int pos){ if(step>n) return; if(step!=0){ for(int i=0;i<5;i++) for(int j=0;j<7;j++) a[step][i][j]=a[step-1][i][j]; move(step,x,y,pos); b[step][0]=x; b[step][1]=y; b[step][2]=pos; } boo=0; bool vis[6][8]={0}; for(int i=0;i<5;i++) for(int j=0;j<7;j++) if(a[step][i][j]){ boo=1; if(i!=4){ dfs(step+1,i,j,1); vis[i+1][j]=1; } if(i&&(!vis[i][j]))dfs(step+1,i,j,-1); } if(boo==0){ for(int i=1;i<=step;i++) printf("%d %d %d ",b[i][0],b[i][1],b[i][2]); exit(0); } } int main() { freopen("mayan.in","r",stdin); freopen("mayan.out","w",stdout); scanf("%d",&n); for(int i=0;i<5;i++){ int j=0; while(scanf("%d",&a[0][i][j++])==1&&a[0][i][j-1]!=0){} } dfs(0,0,0,0); printf("-1 "); return 0; }