POJ 2965 The Pilots Brothers' refrigerator(暴力DFS)

题目链接

以前的时候,大一上的时候以为是大水题,当时连题意都没读懂,再次做枚举16个点,900+,差点就超时了。。。和那个翻棋子特别类似。

 1 #include <stdio.h>
 2 #include <string.h>
 3 int z;
 4 char p[4][4];
 5 int o[4][4];
 6 void change(int x,int y)
 7 {
 8     int i;
 9     for(i = 0;i <= 3;i ++)
10     {
11         if(p[x][i] == '-'&&i != y)
12         p[x][i] = '+';
13         else if(p[x][i] == '+'&&i != y)
14         p[x][i] = '-';
15     }
16     for(i = 0;i <= 3;i ++)
17     {
18         if(p[i][y] == '+'&&i != x)
19         p[i][y] = '-';
20         else if(p[i][y] == '-'&&i != x)
21         p[i][y] = '+';
22     }
23     if(p[x][y] == '+')
24     p[x][y] = '-';
25     else
26     p[x][y] = '+';
27     return ;
28 }
29 int judge()
30 {
31     int i,y = 0,j;
32     for(i = 0;i <= 3;i ++)
33     for(j = 0;j <= 3;j ++)
34     {
35         if(p[i][j] == '+')
36         y = 1;
37     }
38     if(y) return 0;
39     else return 1;
40 }
41 void dfs(int x,int y)
42 {
43     int i,j,k,r,c;
44     if(z) return ;
45     if(judge())
46     {
47         z = 1;
48         k = 0;
49         for(i = 0;i <= 3;i ++)
50         for(j = 0;j <= 3;j ++)
51         {
52             if(o[i][j])
53             k ++;
54         }
55         printf("%d\n",k);
56         for(i = 0;i <= 3;i ++)
57         for(j = 0;j <= 3;j ++)
58         {
59             if(o[i][j])
60             printf("%d %d\n",i+1,j+1);
61         }
62         return ;
63     }
64     if(x > 3)
65     return ;
66     if(y+1 <= 3)
67     {
68         r = x;
69         c = y+1;
70     }
71     else
72     {
73         r = x+1;
74         c = 0;
75     }
76     o[x][y] = 1;
77     change(x,y);
78     dfs(r,c);
79     change(x,y);
80     o[x][y] = 0;
81     dfs(r,c);
82 }
83 int main()
84 {
85     int i;
86     z = 0;
87     for(i = 0;i <= 3;i ++)
88     gets(p[i]);
89     dfs(0,0);
90     return 0;
91 }

 

posted @ 2012-07-14 15:36  Naix_x  阅读(200)  评论(0)    收藏  举报