dA - Flip Game
POJ - 1753
1.思路:此题只有四行四列,可用深搜来做。有一个思想误区,在从(0,0)开始遍历后,每路过一个可翻的点时,都有
翻或不翻两个选择,这些不同选择提供了多种不同的方法,(如果数据可以找到)这些方法中一定有正确的,
再将最少的结果输出。(如果数据找不到)输出不可能即可。
2.注意:此题和其他普通的搜索不同的是:一般情况下搜索的方向是走完一个点后去往下一个点的方向,此题的重点不
是该走的方向,而是翻或不翻。
3.第一次写这个代码的时候有一些问题。需要注意的有:
a.每递归一次都要验证一遍是否已得到所得结果,此时的结果最小不能将整个地图遍历完再验证。
b.验证后发现可以就return,去寻找其他方法;
c.当遍历完时,此时进入递归x=4,也要return;
d.输出结果的限制是min<=16。
POJ - 1753
1.思路:此题只有四行四列,可用深搜来做。有一个思想误区,在从(0,0)开始遍历后,每路过一个可翻的点时,都有
翻或不翻两个选择,这些不同选择提供了多种不同的方法,(如果数据可以找到)这些方法中一定有正确的,
再将最少的结果输出。(如果数据找不到)输出不可能即可。
2.注意:此题和其他普通的搜索不同的是:一般情况下搜索的方向是走完一个点后去往下一个点的方向,此题的重点不
是该走的方向,而是翻或不翻。
3.第一次写这个代码的时候有一些问题。需要注意的有:
a.每递归一次都要验证一遍是否已得到所得结果,此时的结果最小不能将整个地图遍历完再验证。
b.验证后发现可以就return,去寻找其他方法;
c.当遍历完时,此时进入递归x=4,也要return;
d.输出结果的限制是min<=16。
代码:
#include<stdio.h>
int c[5][2]={0,0,1,0,0,1,-1,0,0,-1},min1;
char a[5][5];
int sou()
{
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 turn(int x,int y)
{
int i;
for(i=0;i<5;i++)
{
int dx=x+c[i][0];
int dy=y+c[i][1];
if(dx<0||dy<0||dx>=4||dy>=4)continue;
if(a[dx][dy]=='b')
a[dx][dy]='w';
else a[dx][dy]='b';
}
}
void dfs(int x,int y,int s)
{
if(sou())
{
if(s<min1)
min1=s;
return;
}
if(x==4)return ;
turn(x,y);
if(y==3)dfs(x+1,0,s+1);
else dfs(x,y+1,s+1);
turn(x,y);
if(y==3)dfs(x+1,0,s);
else dfs(x,y+1,s);
}
int main()
{
int i;
for(i=0;i<4;i++)
scanf("%s",a[i]);
min1=999;
dfs(0,0,0);
if(min1<=16)printf("%d\n",min1);
else
printf("Impossible\n");
}