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;
 }

 

 

posted @ 2012-05-30 16:55  Naix_x  阅读(182)  评论(0编辑  收藏  举报