#include<bits/stdc++.h>
using namespace std;
int n;
int ans[5][3],ans_num;
struct make
{
int r[5][7];//,h[5];
}b[7];
void put(make a)
{
/*if(a.r[0][0]==-8848) return;
for(int i=3;i>=0;i--)
{
for(int j=0;j<5;j++)
if(a.r[j][i]==-1)
cout<<a.r[j][i]<<" ";
else
cout<<" "<<a.r[j][i]<<" ";
cout<<endl;
}
cout<<endl;*/
}
bool find(make a)
{
if(a.r[0][0]==-8848) return false;
for(int i=0;i<7;i++)
for(int j=0;j<5;j++)
if(a.r[j][i]!=-1)
return false;
return true;
}
make move2(make a)
{
//return a;
for(int i=0;i<5;i++)
for(int k=0;k<3;k++)
for(int j=1;j<7/*a.h[i]*/;j++)
if(a.r[i][j]!=-1&&a.r[i][j-1]==-1)
swap(a.r[i][j],a.r[i][j-1]);
/*else
{
//a.h[i]=j;
break;
}*/
bool w[5][7],t=true;
memset(w,false,sizeof(w));
for(int i=0;i<5;i++)
for(int j=0;j<7;j++)
if(a.r[i][j]!=-1)
{
if(i<3&&a.r[i][j]==a.r[i+1][j]&&a.r[i+1][j]==a.r[i+2][j])
w[i][j]=true,w[i+1][j]=true,w[i+2][j]=true,t=false;
if(j<5&&a.r[i][j]==a.r[i][j+1]&&a.r[i][j+1]==a.r[i][j+2])
w[i][j]=true,w[i][j+1]=true,w[i][j+2]=true,t=false;
}
if(t) return a;
for(int i=0;i<5;i++)
for(int j=0;j<7;j++)
if(w[i][j])
a.r[i][j]=-1;
return move2(a);
}
make move(int x,int y,int r,make a)
{
if(a.r[0][0]==-8848) return a;
if(a.r[x][y]==-1||(r==1&&x==4)||(r==-1&&x==0))
{
a.r[0][0]=-8848;
return a;
}
int y2=y,x2=(r==1?x+1:x-1);
//if(a.r[x2][y2]==-1) a.h[x2]=y;
swap(a.r[x][y],a.r[x2][y2]);
return move2(a);
}
bool ask(int m)
{
/*if(b[m].r[0][0]!=-8848)
{
cout<<" "<<m<<endl;
put(b[m]);
}*/
if(m==n||b[m].r[0][0]==-8848) return false;
for(int i=0;i<5;i++)
{
for(int j=0;j<7;j++)
{
ans[m][0]=i;
ans[m][1]=j;
ans[m][2]=1;
ans_num=m;
b[m+1]=move(i,j,1,b[m]);
if(find(b[m+1])) return true;
else if(ask(m+1)) return true;
ans[m][2]=-1;
b[m+1]=move(i,j,-1,b[m]);
if(find(b[m+1])) return true;
else if(ask(m+1)) return true;
}
}
return false;
}
int main()
{
memset(b[0].r,-1,sizeof(b[0].r));
cin>>n;
int num;
for(int i=0,j;i<5;++i)
{
j=-1;
while(cin>>num)
{
if(num==0)
{
//b[0].h[i]=j;
break;
}
b[0].r[i][++j]=num;
}
}
put(b[0]);
if(ask(0))
for(int i=0;i<=ans_num;i++)
cout<<ans[i][0]<<" "<<ans[i][1]<<" "<<ans[i][2]<<endl;
else
cout<<-1;
}
输入
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
——————
输出(正解)
1 1 -1
2 4 1
3 2 1
3 6 1
3 3 1
——————
输出(本代码)
1 1 -1
2 4 1
3 2 1
3 3 1
3 3 1