这个题是个大爆搜。。。
考虑把一个位置的方块移到右面,就等同于把一个方块移到左面,所以只枚举向右的就行了,可以保证优先级,但这个位置的方块如果是空的,虽然是向右移的,但题目不让这么输出,所以打个标记就行了。
所以我们的思路就出来了,先枚举换的位置,如果相同就不用换,然后交换,清除,使空中的快下降,
下降完后一次次清除,一次次下降,直到不行为止,这样的话不会超时吗,因为n只有5啊,所以不会爆。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<stdlib.h>
using namespace std;
int a[9][9],n;
struct st{
int x,y,f;
}ans[19];
int empty(){//检查是否为空
for(int i=0;i<5;i++)
for(int j=0;j<7;j++)
if(a[i][j])return 0;
return 1;
}
int check()//检查有没有小于三的块
{
int sum[12];
memset(sum,0,sizeof sum);
for(int i=0;i<5;i++)
for(int j=0;j<7;j++)
sum[a[i][j]]++;
for(int i=1;i<=10;i++)
if(sum[i]!=0&&sum[i]<3) return 0;
return 1;
}
void drop(){//使上面的下降
int num[10][10];
memset(num,-1,sizeof num);
for(int i=0;i<5;i++)
{
int h=0;
for(int j=0;j<7;j++)
if(a[i][j])
num[i][h++]=j;
}
for(int i=0;i<5;i++)
for(int j=0;j<7;j++)
a[i][j]=num[i][j]==-1?0:a[i][num[i][j]];
return ;
}
int clear(){//消除
int flag=0;
for(int i=0;i<=2;i++)
for(int j=0;j<7;j++)
{
if(a[i][j])
{
int x=i+1;
while(a[i][j]==a[x][j]&&x<5) x++;x--;
if(x-i>=2)
{
for(int k=i;k<=x;k++)
{
int yu=j+1,yd=j-1;
while(a[i][j]==a[k][yu]&&yu<7)yu++;yu--;
while(a[i][j]==a[k][yd]&&yd>=0)yd--;yd++;
if(yu-yd>=2){
for(int q=yd;q<=yu;q++)
a[k][q]=0;
}
}
for(int k=i;k<=x;k++)
a[k][j]=0;
flag=1;
}
}
}
for(int i=0;i<5;i++)
for(int j=0;j<=4;j++)
{
if(a[i][j])
{
int y=j+1;
while(a[i][j]==a[i][y]&&y<7) y++;y--;
if(y-j>=2)
{
for(int k=j;k<=y;k++)
{
int xu=i+1,xd=i-1;
while(a[i][j]==a[xu][k]&&xu<5)xu++;xu--;
while(a[i][j]==a[xd][k]&&xd>=0)xd--;xd++;
if(xu-xd>=2){
for(int q=xd;q<=xu;q++)
a[q][k]=0;
}
}
for(int k=j;k<=y;k++)
a[i][k]=0;
flag=1;
}
}
}
if(flag) return 1;
else return 0;
}
void dfs(int X){
if(X>=n+1)
{
if(empty()){
for(int i=1;i<=n;i++){
if(ans[i].f)
printf("%d %d %d\n",ans[i].x,ans[i].y,1);
else
printf("%d %d %d\n",ans[i].x+1,ans[i].y,-1);
} exit(0);
}
return ;
}
if(!check())return ;
for(int i=0;i<4;i++)
for(int j=0;j<7;j++)
{
if(a[i][j]!=a[i+1][j])
{
ans[X].x=i;//记录交换的坐标和标记
ans[X].y=j;
ans[X].f=a[i][j];
int tmp[6][8];
memcpy(tmp,a,sizeof tmp);
swap(a[i][j],a[i+1][j]);
drop();
while(clear()) drop();
dfs(X+1);
ans[X].x=0;
ans[X].y=0;
ans[X].f=0;
memcpy(a,tmp,sizeof a);
}
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<5;i++)
{
int x=1,t=0;
while(x!=0)
{
scanf("%d",&x);
a[i][t++]=x;
}
}
dfs(1);
printf("-1");
}