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 }