POJ 1753 Flip Game(DFS)
练习DFS,以前知道思路,枚举每个点翻或者不翻,可是不知道如何去表达。虎哥给提示了下,自己编出来很费劲啊。。。而且,判断边界的时候WA了好几次啊。。而且居然,跑的异常的慢。。。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char p[5][5];
int min;
int judge()//判断函数
{
int i,j,sum = 0;
for(i = 0;i <= 3;i ++)
for(j = 0;j <= 3;j ++)
{
if(p[i][j]=='b')
sum ++;
}
if(sum==0||sum==16)
return 1;
else
return 0;
}
void change(int x,int y)//改变一个点
{
if(x+1 <= 3 && p[x+1][y] == 'b')
p[x+1][y] = 'w';
else if(x + 1 <= 3 && p[x+1][y] == 'w')
p[x+1][y] = 'b';
if(x-1 >= 0 && p[x-1][y] == 'b')
p[x-1][y] = 'w';
else if(x - 1 >= 0 && p[x-1][y] == 'w')
p[x-1][y] = 'b';
if(y+1 <= 3 && p[x][y+1] == 'b')
p[x][y+1] = 'w';
else if(y + 1 <= 3 && p[x][y+1] == 'w')
p[x][y+1] = 'b';
if(y-1 >= 0 && p[x][y-1] == 'b')
p[x][y-1] = 'w';
else if(y -1 >= 0 && p[x][y-1] == 'w')
p[x][y-1] = 'b';
if(p[x][y] =='b')
p[x][y] = 'w';
else
p[x][y] = 'b';
}
void dfs(int step,int x,int y)//深搜
{
int a,b;
if(judge())
{
if(min>step)
min = step;
}
if(x > 3||y > 3) return ;//开始的时候把这条语句放在judge前面了。。。
if(y+1>3)
{
a = x + 1;
b = 0;
}
else
{
a = x;
b = y + 1;
}
dfs(step,a,b);
change(x,y);
dfs(step+1,a,b);
change(x,y);//回溯
}
int main()
{
int i;
for(i = 0;i <= 3;i ++)
gets(p[i]);
min = 17;
if(judge())printf("0\n");
else
{
dfs(0,0,0);
if(min != 17)
printf("%d\n",min);
else
printf("Impossible\n");
}
return 0;
}
#include <stdlib.h>
#include <string.h>
char p[5][5];
int min;
int judge()//判断函数
{
int i,j,sum = 0;
for(i = 0;i <= 3;i ++)
for(j = 0;j <= 3;j ++)
{
if(p[i][j]=='b')
sum ++;
}
if(sum==0||sum==16)
return 1;
else
return 0;
}
void change(int x,int y)//改变一个点
{
if(x+1 <= 3 && p[x+1][y] == 'b')
p[x+1][y] = 'w';
else if(x + 1 <= 3 && p[x+1][y] == 'w')
p[x+1][y] = 'b';
if(x-1 >= 0 && p[x-1][y] == 'b')
p[x-1][y] = 'w';
else if(x - 1 >= 0 && p[x-1][y] == 'w')
p[x-1][y] = 'b';
if(y+1 <= 3 && p[x][y+1] == 'b')
p[x][y+1] = 'w';
else if(y + 1 <= 3 && p[x][y+1] == 'w')
p[x][y+1] = 'b';
if(y-1 >= 0 && p[x][y-1] == 'b')
p[x][y-1] = 'w';
else if(y -1 >= 0 && p[x][y-1] == 'w')
p[x][y-1] = 'b';
if(p[x][y] =='b')
p[x][y] = 'w';
else
p[x][y] = 'b';
}
void dfs(int step,int x,int y)//深搜
{
int a,b;
if(judge())
{
if(min>step)
min = step;
}
if(x > 3||y > 3) return ;//开始的时候把这条语句放在judge前面了。。。
if(y+1>3)
{
a = x + 1;
b = 0;
}
else
{
a = x;
b = y + 1;
}
dfs(step,a,b);
change(x,y);
dfs(step+1,a,b);
change(x,y);//回溯
}
int main()
{
int i;
for(i = 0;i <= 3;i ++)
gets(p[i]);
min = 17;
if(judge())printf("0\n");
else
{
dfs(0,0,0);
if(min != 17)
printf("%d\n",min);
else
printf("Impossible\n");
}
return 0;
}