POJ_1753_ Flip Game(枚举)

http://poj.org/problem?id=1753

/*
对于一个函数,一定要清楚他是干什么用的,就如同这里的dfs一样,
它的作用是从(1,1)开始翻 ,翻step次判断是否有满足的青一色。
其中deep是模拟的树的深度,此处是记录翻过得次数。在dfs函数中又
增加了翻棋函数,判断函数,他们的作用都很明显。往后就是,deep不等于
step执行的操作,分为两种a:当前棋子翻过来用deep记录看看后面的有没有满足的,
b:当前棋子不翻往后找有没有满足的,因为dfs函数的作用就是找有没有满足的。
*/

网上用位操作的没看懂,这也是看的网上的自己理解的。

http://user.qzone.qq.com/289065406/blog/1299076400

 1 # include <stdio.h>
 2 # include <string.h>
 3 char chess[6][6]={0};
 4 int flag,step;
 5 int a[]={-1,1,0,0,0};
 6 int b[]={0,0,-1,1,0};
 7 //意思是行左移行右移,列左移列右移。行列不变,
 8 //正好是-1,1,0的组合。
 9 int judge_chess()//判断是否为一个颜色。
10 {
11     int i,j,temp=1;
12     for(i=1;i<5;i++)
13     {
14         for(j=1;j<5;j++)
15             if(chess[i][j]!=chess[1][1])
16             {
17                 temp=0;
18                 break;
19             }
20     }
21     return temp;
22 }
23 void turn(int r,int c)//翻棋操作。
24 {
25     int i;
26     for(i=0;i<5;i++)
27     {
28         chess[r+a[i]][c+b[i]]=!chess[r+a[i]][c+b[i]];
29     }
30 }
31 void dfs(int row,int col,int deep)
32 {
33     if(deep==step)//deep指你当前翻得棋子数,只有当翻得妻子书等于step
34         //时才能判断是否是一个颜色,因为你前面的步数逐步增加来找的。
35     {
36         flag=judge_chess();
37         return;
38     }
39     if(flag==1 || row==5)
40         return;//flag=1说明已经找到,而row=5说明没找到,都要返回。
41     turn(row,col);//翻棋操作。
42     if(col<4)
43         dfs(row,col+1,deep+1);//列加一往后找。
44     else
45         dfs(row+1,1,deep+1);
46     turn(row,col);//如果前面找不到,那么当前棋子不执行翻棋,从下一个操作开始找。
47     if(flag==0)
48     {
49         if(col<4)
50             dfs(row,col+1,deep);
51         else
52             dfs(row+1,1,deep);
53     }
54     return;
55 }
56 int main()
57 {
58     int i,n,j;
59     char ch[4][4];
60     for(i=0;i<4;i++)
61     {
62         scanf("%s",ch[i]);
63     }
64     for(i=0;i<4;i++)
65         for(j=0;j<4;j++)
66         {
67             if(ch[i][j]=='b')
68                 chess[i+1][j+1]=1;
69         }
70         for(step=0;step<=16;step++)
71         {
72             dfs(1,1,0);
73             //对于每一个step都从树根开始搜索,1,1即代表要翻得棋子是(1,1);
74             //因为你的每一步都会进行翻棋操作,如果从step开始之前的棋子便不翻了。
75             if(flag)
76                 break;
77             
78         }
79         if(flag)
80             printf("%d\n",step);
81         else 
82             printf("Impossible\n");
83         return 0;
84 }
View Code

 

posted on 2013-08-09 09:55  随风浪子的博客  阅读(176)  评论(0编辑  收藏  举报

导航