QAQ
思路:DFS+模拟
依次枚举每个格子,颜色不同进行交换,先下落,再进行消除
剪枝:当前有颜色的个数为1或2直接退出
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int col[6][8];
int ans[99][3];
int num[11];
int n;
bool rx(int col[6][8])// 消除颜色相同的格子
{
bool Flag=0,f[6][8]={0};
for(int i=1;i<=5;i++)
for(int j=1;j<=7;j++)
if (col[i][j])
{
if (i<=3&&col[i][j]==col[i+1][j]&&col[i+1][j]==col[i+2][j])
f[i][j]=f[i+1][j]=f[i+2][j]=true;
if (j<=5&&col[i][j]==col[i][j+1]&&col[i][j+1]==col[i][j+2])
f[i][j]=f[i][j+1]=f[i][j+2]=true;
}
for (int i=1;i<=5;i++)
for (int j=1;j<=7;j++)
if (f[i][j])
{
col[i][j]=0;
Flag=true;
}
return Flag;
}
void fall_down(int col[6][8]) //下落,重新构图
{
for (int a=1;a<=5;a++)
{
int t(0);
for (int b=1;b<=7;b++)
{
int T=col[a][b];
col[a][b]=0;
if (T)
col[a][++t]=T;
}
}
}
bool check(int col[6][8])//判断
{
for(int i=1;i<=5;i++)
for(int j=1;j<=7;j++)
if(col[i][j]) return 0;
return 1;
}
void dfs(int step,int col[6][8])
{
if(step>n)
{
if(check(col))
{
for(int i=1;i<=n;i++)
if(ans[i][2])
printf("%d %d -1\n",ans[i][0],ans[i][1]-1);
else
printf("%d %d 1\n",ans[i][0]-1,ans[i][1]-1);
exit(0);
}
return;
}
memset(num,0,sizeof(num));
for(int i=1;i<=5;i++)
for(int j=1;j<=7;j++)
if(col[i][j])
num[col[i][j]]++;
for(int i=1;i<=10;i++)
if(num[i]==1||num[i]==2) return;
int f[6][8]={0};
for(int i=1;i<5;i++)
for(int j=1;j<=7;j++)
if(col[i][j]!=col[i+1][j])
{
memcpy(f,col,sizeof(f));//复制函数
ans[step][0]=i;
ans[step][1]=j;
ans[step][2]=!col[i][j];
swap(f[i][j],f[i+1][j]);
fall_down(f);
while(rx(f))
fall_down(f);
dfs(step+1,f);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=5;i++)
for(int j=1;;j++)
{
scanf("%d",&col[i][j]);
if(!col[i][j]) break;
}
dfs(1,col);
printf("-1");
return 0;
}