The Pilots Brotrefrigeratorhers
题目描述
思路:
该题同Flip Game基本一致,不同点在于需要将改变的数据进行存储。那么主要的方法是建立三个数组,一个数组用于存储原始数据,一个数组用于临时存储改变后的数据,一个数组用于当本次结果小于前面结果时存储并最后输出。
#include <cstdio>
#include <iostream>
using namespace std;
int n=0x7fffffff,a[4][4],b[2][16],c[2][16];//a用于存储原本数据,b用于暂时存储改变的数据,c用于存储最终的数据
bool pan()
{
for(int i=0;i<4;i++)
{
for(int t=0;t<4;t++)
{
if(a[i][t]==1)return false;
}
}
return true;
}
void change(int i,int j)
{
for(int t=0;t<4;t++)
{
a[i][t]=!a[i][t];//这里的翻转方法需要注意一下
a[t][j]=!a[t][j];
}
a[i][j]=!a[i][j];
}
void dfs(int d,int k)
/*
这里建议用这种方式,
因为如果用void dfs(int x,int y,int num)这种方式的话
那么将会导致很多麻烦,例如换行,计数等
*/
{
int x,y;
if(d==16)
{
if(pan())
{
if(k<n)
{
n=k;
//这里需要对改动过程进行记录
for(int i=0;i<n;i++)
{
c[0][i]=b[0][i];
c[1][i]=b[1][i];
}
}
}
return;
}
else
{
x=d/4;
y=d%4;
//先遍历下一个,表示没有翻转的遍历,后翻转再遍历,最后翻回去
dfs(d+1,k);
change(x,y);
b[0][k]=x,b[1][k]=y;//记录改动的方式
dfs(d+1,k+1);
change(x,y);
}
}
int main()
{
char x;
for(int i=0;i<4;i++)
{
for(int t=0;t<4;t++)
{
cin>>x;//这个地方只能用cin不能用scanf,因为有回车符
if(x=='+')a[i][t]=1;
else a[i][t]=0;
}
}
dfs(0,0);
printf("%d\n",n);
for(int i=0;i<n;i++)
{
printf("%d %d\n",c[0][i]+1,c[1][i]+1);
}
return 0;
}