#include<stdio.h>
int n,a[6][5][8],vis[5][7],ans[6][3];
void copy(int k){
for(int i=0;i<5;++i)
for(int j=0;j<7;++j)
a[k][i][j]=a[k-1][i][j];
}
void down(int k){
for(int i=0;i<5;++i)
for(int j=0,t=0,x;j<7;++j)
if(a[k][i][j]){
x=a[k][i][j],a[k][i][j]=0,a[k][i][t++]=x;
}
}
void update(int k){
down(k);
for(int i=0;i<5;++i)
for(int j=0;j<7;++j)
vis[i][j]=0;
int flag=0;
for(int i=0;i<5;++i)
for(int j=0;j<7;++j){
if(j<5&&a[k][i][j]&&a[k][i][j]==a[k][i][j+1]&&a[k][i][j+1]==a[k][i][j+2])
flag=vis[i][j]=vis[i][j+1]=vis[i][j+2]=1;
if(i>1&&a[k][i][j]&&a[k][i][j]==a[k][i-1][j]&&a[k][i-1][j]==a[k][i-2][j])
flag=vis[i][j]=vis[i-1][j]=vis[i-2][j]=1;
}
if(flag){
for(int i=0;i<5;++i)
for(int j=0;j<7;++j)
if(vis[i][j])
a[k][i][j]=0;
update(k);
}
}
bool check(int k){
for(int i=0;i<5;++i)if(a[k][i][0])return 0;
return 1;
}
bool dfs(int k){
if(k>n)return check(n);
for(int i=0;i<5;++i)
for(int j=0;j<7;++j)
if(a[k-1][i][j]){
if(i<4){
copy(k);
a[k][i][j]=a[k-1][i+1][j],a[k][i+1][j]=a[k-1][i][j];
update(k);
if(dfs(k+1)){
ans[k][0]=i,ans[k][1]=j,ans[k][2]=1;
return 1;
}
}
if(i&&!a[k-1][i-1][j]){
copy(k);
a[k][i-1][j]=a[k][i][j],a[k][i][j]=0;
update(k);
if(dfs(k+1)){
ans[k][0]=i,ans[k][1]=j,ans[k][2]=-1;
return 1;
}
}
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<5;++i)
for(int j=0;scanf("%d",&a[0][i][j]),a[0][i][j];++j);
if(dfs(1))
for(int i=1;i<=n;++i)
printf("%d %d %d\n",ans[i][0],ans[i][1],ans[i][2]);
else puts("-1");
return 0;
}
开 o2 就 RE 一片,不开 o2 #8 过不去
#8
in:
5
2 0
2 3 4 3 0
4 4 3 4 6 2 0
4 6 1 1 4 4 3 0
3 4 6 6 1 3 4 0
ans:
1 1 -1
2 4 1
3 2 1
3 6 1
3 3 1
out:
0 0 1
0 0 1
0 0 1
0 0 1
0 0 0