The Pilots Brothers' refrigerator (POJ 2965)

http://poj.org/problem?id=2965

这个题目和上一道题目差不多,暴搜可解。

代码如下:

#include<cstdio>
#include<cstring>
using namespace std;
//还要记录成功翻牌时的坐标顺序
struct point
{
int x;
int y;
}order[16];//按照顺序记下翻牌的坐标
char m[4][9];//+是关,-表示开
int value[4][4];
int limit,ok=0;
int check()
{
if(ok)return 1;
for(int i=0;i<4;i++)
for(int k=0;k<4;k++)
if(value[i][k]){ok=0;return 0;}
return 1;//返回一表示成功了
}
void change(int x,int y)
{
for(int i=0;i<4;i++)
{
value[x][i]=!value[x][i];
value[i][y]=!value[i][y];
}
value[x][y]=!value[x][y];
}
void dfs(int x,int y,int step)
{
if(step==limit)//这里写成if(step==limit&&check())就会超时,谁知道是为什么啊?????大神来踩我一下哈!不胜感激了
{
ok=check();//printf("%d %d ",limit,check());
return;
}
if(x<0||y<0||x>=4||y>=4||ok)return;
change(x,y);
order[step+1].x=x;
order[step+1].y=y;
if(x<=2)dfs(x+1,y,step+1);
else dfs(0,y+1,step+1);
if(ok)return;
change(x,y);
if(x<=2)dfs(x+1,y,step);
else dfs(0,y+1,step);
return;
}
int main()
{
for(int i=0;i<4;i++)
scanf("%s",m[i]);
for(int i=0;i<4;i++)
for(int k=0;k<4;k++)
{
if(m[i][k]=='-')value[i][k]=0;
else value[i][k]=1;
}
for(limit=0;limit<=16;limit++)
{
dfs(0,0,0);
if(ok)break;
}
if(ok)
{
printf("%d ",limit);
for(int i=1;i<=limit;i++)
printf("%d %d ",order[i].x+1,order[i].y+1);
}
else printf("Impossible ");
return 0;
}

原文地址:https://www.cnblogs.com/plank-george-zzo/p/3208434.html