一、枚举:1753
北大POJ1753:Flip Game
题目
分析
代码
我用了DFS,附上代码:
//poj1753
//DFS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int MAP[5][5];
int ans = 999999;
int judge (void) //看是否已经满足全黑、全白的条件。
{
int i,k;
int ans = 0;
for (i = 0;i < 4;i++)
for (k = 0;k < 4;k++)
ans += MAP[i][k];
if (ans == 0 || ans == 16)
return 1;
return 0;
}
int reverse (int x,int y)
{
MAP[x][y] = !MAP[x][y]; //实现棋盘反转。
if (x - 1 >= 0)
MAP[x - 1][y] = !MAP[x - 1][y];
if (y - 1 >= 0)
MAP[x][y - 1] = !MAP[x][y - 1];
if (x + 1 < 4)
MAP[x + 1][y] = !MAP[x + 1][y];
if (y + 1 < 4)
MAP[x][y + 1] = !MAP[x][y + 1];
return 0;
}
int dfs (int x,int y,int t) //对棋盘遍历。
{
if (judge ())
{
if (ans > t)
ans = t;
return 0;
}
if (x >= 4 || y >= 4)
return 0;
int nx = (x + 1) % 4,ny = y + (x + 1) / 4;
dfs (nx,ny,t);
reverse (x,y);
dfs (nx,ny,t + 1);
reverse (x,y);
return 0;
}
int main()
{
int i,k;
for (i = 0;i < 4;i++)
{
char s[5];
scanf ("%s",s);
for (k = 0;k < 4;k++)
if (s[k] == 'b')
MAP[i][k] = 1;
else
MAP[i][k] = 0;
}
dfs (0,0,0);
if (ans == 999999)
puts ("Impossible");
else
printf ("%d\n",ans);
return 0;
}
进阶
后来查了一些经验帖子,发现有一个用位运算的方法,是《编程珠玑》在第一章讲过的内容,附上传送门