#include<bits/stdc++.h>
int n,a[5][7],s[5][3],t[7],d;//a 为目前 dfs 后得到的界面,s 为答案,d 为搜索层数
bool b[5][7];//b[i][j] 用于记录 (i,j) 是否需要被消除
bool f(){//更新游戏界面
bool y=0;//y=0 表示已通关
for(int i=0;i<5;i++){
int x=-1;
for(int j=0;j<7;j++)
if(b[i][j])a[i][j]=b[i][j]=0;
else if(a[i][j])t[++x]=a[i][j];//t 用于自下而上记录该列的格子颜色
memcpy(a[i],t,28);//重置该列(掉落悬空块)
memset(t,0,x+1<<2);
y|=~x;
}
bool z=0;//z 用于判断该游戏界面是否需要消除
for(int i=0;i<3;i++)for(int j=0;j<7;j++)if(a[i][j]&&a[i][j]==a[i+1][j]&&a[i][j]==a[i+2][j])z=1,b[i][j]=b[i+1][j]=b[i+2][j]=1;
for(int i=0;i<5;i++)for(int j=0;j<5;j++)if(a[i][j]&&a[i][j]==a[i][j+1]&&a[i][j]==a[i][j+2])z=1,b[i][j]=b[i][j+1]=b[i][j+2]=1;
//记录消除格
if(!y&&!d){
while(n--)printf("%d %d %d\n",s[n][0],s[n][1],s[n][2]);
exit(0);
}
return z;
}
void _(){
for(int i=0;i<5;i++)for(int j=0;j<7;j++)if(a[i][j]){
if(i^4&&a[i][j]^a[i+1][j]){
int r[5][7];
memcpy(r,a,140);
std::swap(a[i][j],a[i+1][j]);
s[d][0]=i,s[d][1]=j,s[d][2]=1;//记录操作
bool z;
do z=f();while(z);//在需要消除时不断消除
if(d)d--,_(),d++;
memcpy(a,r,140);
}
if(i&&!a[i-1][j]){
int r[5][7];
memcpy(r,a,140);
std::swap(a[i][j],a[i-1][j]);
s[d][0]=i,s[d][1]=j,s[d][2]=-1;
bool z;
do z=f();while(z);
if(d)d--,_(),d++;
memcpy(a,r,140);
}
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<5;i++)for(int j=0;;j++){
scanf("%d",&a[i][j]);
if(!a[i][j])break;
}
d=n-1;
_();
puts("-1");
}
在我提交这段代码时,我兴奋于这段代码的正确性如此之高。可就在我打开 O2 优化再一测时,测试点 #8 却没有输出正确答案。
我十分疑惑,便把这段代码复制到了洛谷 IDE 上,再下载了测试点 #8 一测——谁知,这段代码什么也没有输出,便毫无预告地结束了。
看到这里,我的疑问更多了:这段代码中,明明不管怎样都是要输出的(不是到 f 函数里输出答案,就是到主函数里输出 -1),却为什么会有可能什么也不输出? 大家能告诉我其中的道理吗?