Flip Game 深搜

来源:互联网 发布:sql 父子级联查询 编辑:程序博客网 时间:2024/05/29 11:35

A - Flip Game

 POJ - 1753 
dA - Flip Game
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");}