#include <bits/stdc++.h>
#define rep(i,j,k) for(register int i(j);i!=(k+1);++i)
using namespace std;
int a[6][11][11],n,b[11][11],step[11][11],flag;
void change()
{
rep(i,0,4) {
int k=0;
rep(j,0,6) {
if(b[j][i]) {
swap(b[j-k][i],b[j][i]);
} else k++;
}
}
}
bool vis[10][10];
int xc() {
change();
memset(vis,0,sizeof vis);
int fla=0;
rep(i,0,6) rep(j,0,4)
{
if(!b[i][j]) continue;
if(b[i+1][j]==b[i][j]&&b[i+2][j]==b[i][j]&&i+2<=6)
{
vis[i+1][j]=vis[i][j]=vis[i+2][j]=1;
fla=1;
}
if(b[i][j+1]==b[i][j]&&b[i][j+2]==b[i][j]&&j+2<=4)
{
vis[i][j+1]=vis[i][j]=vis[i][j+2]=1;
fla=1;
}
}
rep(i,0,6) rep(j,0,4)
if(vis[i][j])
b[i][j]=0;
if(fla) xc();
}
int check() {
rep(i,0,4)
if(b[0][i]) return 0;
return 1;
}
void dfs(int num) {
if(num>n) {
if(check()) {
for(int k=1; k<num; k++)
cout<<step[k][1]<<" "<<step[k][2]<<" "<<step[k][3]<<endl;
exit(0);
}
return ;
}
memmove(a[num],b,sizeof b);
rep(j,0,4)
rep(i,0,6)
{
if(!b[i][j]) continue;
if(b[i][j]!=b[i][j+1]&&j+1<=6) {
swap(b[i][j],b[i][j+1]);
xc();
step[num][1]=j;
step[num][2]=i;
step[num][3]=1;
dfs(num+1);
memmove(b,a[num],sizeof a[num]);
}
if(!b[i][j-1]&&j-1>=0)
{
swap(b[i][j],b[i][j-1]);
xc();
step[num][1]=j;
step[num][2]=i;
step[num][3]=-1;
dfs(num+1);
memmove(b,a[num],sizeof a[num]);
}
}
}
int main() {
ios::sync_with_stdio(false);
cin>>n;
rep(i,0,4)
{
int x,j=0;
while((cin>>x)&&x)
b[j++][i]=x;
}
dfs(1);
cout<<"-1";
}
第一组答案错误 还有为什么a数组这个回溯的保存现场的数组不能开二维 再重复迭代