您的位置:首页 > 其它

1753 poj Flip Game 据说是枚举,我这种DFS算是枚举不?

2012-11-06 18:09 260 查看
题目连接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1035

题目大意:给你一个黑白的棋盘,每次翻一个子(翻的子上下左右也自动翻),看最后能否返程全黑或者全白、最少要几次。

View Code

#include <stdio.h>
#include <string.h>
int ans = 10000;
char map[10][10];
int pan()
{
int i,j;
for(i = 0;i < 4;i++)
{
for(j = 0;j < 4;j++)
if(map[0][0] != map[i][j])
return 0;
}
return 1;
}
int is_map(int i,int j)//边界判断
{
if(i >= 0&& i < 4 && j >= 0&& j < 4)
return 1;
return 0;
}
void reverse(int i,int j)//翻转
{
if(is_map(i,j))
map[i][j] = (map[i][j]+1)%2;
if(is_map(i,j-1))
map[i][j-1] =(map[i][j-1]+1)%2;
if(is_map(i,j+1))
map[i][j+1] =(map[i][j+1]+1)%2;
if(is_map(i+1,j))
map[i+1][j] =(map[i+1][j]+1)%2;
if(is_map(i-1,j))
map[i-1][j] =(map[i-1][j]+1)%2;

return ;
}
void search(int i,int j,int step)
{
int x1,x2,y1y2;

if(pan())
{
if(ans > step)
ans = step;
return;
}
if(is_map(i,j) == 0)
return;
if(j < 3 && i >=0 && i <= 3)//这个子不翻翻下一个
{
search(i,j+1,step);
}
else
{
if(i <= 3)
{
search(i+1,0,step);//
}
}
reverse(i,j);//翻这个子
if(j < 3 && i >=0 && i <= 3)//翻这个子。
{
search(i,j+1,step+1);
}
else
{
if(i <= 3)
{
search(i+1,0,step+1);

}
}
reverse(i,j);//反回来,算是回溯。

}
int main()
{
int i,j;
for(i = 0;i < 4;i++)
{
scanf("%s",map[i]);
}
for(i = 0;i < 4;i++)
for(j = 0;j < 4;j++)
if(map[i][j] == 'b')
map[i][j] = 1;
else
map[i][j] = 0;
search(0,0,0);
if(ans != 10000)
printf("%d\n",ans);
else
printf("Impossible\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: