您的位置:首页 > 其它

POJ 1753 Flip Game【暴搜DFS】

2014-07-24 17:35 495 查看
题目:http://poj.org/problem?id=1753

#include<stdio.h>
int a[4][4],min=17;
int isok()
{
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j]!=a[0][0])
return 0;
return 1;
}
void flip(int x,int y)
{			//1代表b,0代表w,0和1互变只需要取非
a[x][y]=!a[x][y];
if(x+1<4) a[x+1][y]=!a[x+1][y];
if(y+1<4) a[x][y+1]=!a[x][y+1];
if(x-1>=0) a[x-1][y]=!a[x-1][y];
if(y-1>=0) a[x][y-1]=!a[x][y-1];
}
void dfs(int x,int y,int step)				// 94 MS
{					//x为列
if(isok())
{	if(step<min) min=step;return ; }
if( y>3 || x>3  )	return;	//边界问题,尤其注意y,因为下面对(y+1)dfs时没限制y
flip(x,y);
if(x+1<4)
dfs(x+1,y,step+1);
else
dfs(0,y+1,step+1);
flip(x,y);		//flip是可逆操作,所以翻回来只需要再翻一次
if(x+1<4)		//改变位置,但不加step。作用①改变第一个翻的位置,不能总是(0,0)
dfs(x+1,y,step);			//②实现跳着翻棋,dfs(1,1,1)->dfs(2,1,1)->dfs(2,1,2)相当于(2,1)坐标没动
else
dfs(0,y+1,step);
}
int main()
{
int i,j;
char c;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
c=getchar();
if(c=='b')	a[i][j]=1;
else	a[i][j]=0;
}
getchar();
}
if(isok()) printf("0\n");
else
{
dfs(0,0,0);
if(min==17) printf("Impossible\n");
else
printf("%d\n",min);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: