```cpp
#include<bits/stdc++.h>
//#pragma GCC optimize(2)
#define LL long long
using namespace std;
const int N=10,n=5,m=7/*奇怪的习惯*/;
int k,cnt,sum;
struct pri{//存答案
int x,y,fx;
}ans[N];
struct jvzhen{//矩阵结构体
int f[N][N];//注意我代码里第一维表示列,第二维表示行
jvzhen(){
memset(f,0,sizeof(f));
}
}f;
inline void read(int &x){//好习惯
x=0;int f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
x*=f;
}
#define cin(x) read(x)
//void print(jvzhen f){
// for(int j=m;j>=1;j--){
// for(int i=1;i<=n;i++){
// cout<<f.f[i][j]<<' ';
// }
// cout<<endl;
// }
// cout<<endl;
//}
void fuzhi(jvzhen&f,jvzhen&g){//复制
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
f.f[i][j]=g.f[i][j];
}
}
}
void xialuo(jvzhen&f){//下落
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(f.f[i][j]==0){//这个位置空
for(int k=j+1;k<=m;k++){
swap(f.f[i][k],f.f[i][k-1]);//上面每个都下落
}
}
}
}
}
bool xiaochu(jvzhen&f){//消除能消除的
jvzhen g;
while(true){
xialuo(f);
fuzhi(g,f);
bool flg=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){//看着这个消那个,保证全部消除
if(j+2<=m&&f.f[i][j]&&f.f[i][j]==f.f[i][j+1]&&f.f[i][j]==f.f[i][j+2]){//竖着消除
g.f[i][j]=g.f[i][j+1]=g.f[i][j+2]=0;
flg=0;
}
if(i+2<=n&&f.f[i][j]&&f.f[i][j]==f.f[i+1][j]&&f.f[i][j]==f.f[i+2][j]){//横着消除
g.f[i][j]=g.f[i+1][j]=g.f[i+2][j]=0;
flg=0;
}
}
}
if(flg) break;//没有能消除的了
xialuo(g);
fuzhi(f,g);
}
}
bool panduan(jvzhen f){//判断是否全空
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(f.f[i][j]) return 0;
}
}
return 1;
}
void shuchu(){//输出答案
for(int i=1;i<=k;i++){
printf("%d %d %d\n",ans[i].x-1,ans[i].y-1,ans[i].fx);
}
}
bool shensou(int cnt/*步数*/,jvzhen f/*当前矩阵*/){//dfs
xialuo(f);
xiaochu(f);
if(cnt==k+1){//边界,达到k步
if(panduan(f)){
shuchu();
return 1;
}
return 0;
}
for(int i=1;i<=n;i++){//枚举每个点移动
for(int j=1;j<=m;j++){
if(f.f[i][j]){//剪枝(划掉),空格显然不移动
if(i<n){//右移
swap(f.f[i][j],f.f[i+1][j]);
ans[cnt]={i,j,1};//记录答案
if(shensou(cnt+1,f)){
swap(f.f[i][j],f.f[i+1][j]);
return 1;
}
swap(f.f[i][j],f.f[i+1][j]);
}
if(i>1&&!f.f[i-1][j]){//左移&剪枝,如果是交换的话左右移动等价
swap(f.f[i][j],f.f[i-1][j]);
ans[cnt]={i,j,-1};//记录答案
if(shensou(cnt+1,f)){
swap(f.f[i][j],f.f[i-1][j]);
return 1;
}
swap(f.f[i][j],f.f[i-1][j]);
}
}
}
}
return 0;
}
int main(){
cin(k);
for(int i=1;i<=n;i++){//读入,可能有点奇怪
int j=0,col=0;
while(true){
cin(col);
if(col==0) break;
f.f[i][++j]=col;
}
}
if(!shensou(1,f)){//调用入口
puts("-1");
}
return 0;
}
```
by fangzichang @ 2022-10-21 15:52:31
厌氧:`bool xiaochu(jvzhen&f)` 没有 `return`
by yuhaocheng @ 2023-01-28 14:42:57
@[fangzichang](/user/678087) (考古)
by yuhaocheng @ 2023-01-28 14:50:28
@[yuhaocheng](/user/244309) 乐,早就发现了并且改好了但是懒得发了——
关注给了。
by fangzichang @ 2023-01-28 16:53:57
@[yuhaocheng](/user/244309) [去年11月的记录,可以看到O2+90pts](https://www.luogu.com.cn/record/93615803)
by fangzichang @ 2023-01-28 16:55:06