POJ原址:POJ1753
这道题,交了不代表会了,文章写了也不代表会了,看着别人的差不多弄出来也不代表会了,本来就是边抄边写程序,这个程序更是基本copy。。
说的是枚举,感觉更多是dfs,看不出全部枚举到底在哪里,哎,以后还要再深究深究。
参考链接:
POJ 1753 Flip Game【翻转棋盘+枚举+dfs】 - free斩 - 博客频道 - CSDN.NET
#include<iostream>
using namespace std;
int chess[4][4];
int c=33;//为什么初始化成33?c记录翻转次数
//因为c有可能从0~32 ,33则表示不可能成功了
//这个初始化是为了作为一个评判的标志,有点奇怪但是可以理解
void build()//a记录棋盘状态
{
char a;
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
cin>>a;
if(a=='w')
chess[i][j]=0;
else
chess[i][j]=1;
}
}
void turn(int x,int y)
{
if(x>=0&&x<=3&&y>=0&&y<=3)
chess[x][y]=!chess[x][y];
}
void flip(int s)
{
int i=s/4;
int j=s%4;
turn(i,j);
turn(i-1,j);
turn(i+1,j);
turn(i,j-1);
turn(i,j+1);
}
int if_finish()
{
int i,j,sum=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
sum=sum+chess[i][j];
if(sum%16==0)//sum是0或者是1的话就return 1
return 1;
else
return 0;
}
void dfs(int s,int b)//s是这个格子的号码,b是第几次改变
{
if(if_finish())
{
if(b<c)
c=b;//总觉得应该有个b++,可是这个是递归呀
return;
}
if(s>=16)
return;
dfs(s+1,b);
flip(s);
dfs(s+1,b+1);
flip(s);
//只有这四条语句弄不懂了,可是实在不懂,感觉有回溯,还有递归
}
int main()
{
build();
dfs(0,0);
if(c==33)//只有两种正反的情况,可能次数为16*2
cout<<"Impossible\n"<<endl;
else
cout<<c<<endl;
return 0;
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
太动人了,那个参考链接的楼主人也太好点吧,人间自有真爱在^_^~