题目连接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1035
题目大意:给你一个黑白的棋盘,每次翻一个子(翻的子上下左右也自动翻),看最后能否返程全黑或者全白、最少要几次。
View Code
1 #include <stdio.h> 2 #include <string.h> 3 int ans = 10000; 4 char map[10][10]; 5 int pan() 6 { 7 int i,j; 8 for(i = 0;i < 4;i++) 9 { 10 for(j = 0;j < 4;j++) 11 if(map[0][0] != map[i][j]) 12 return 0; 13 } 14 return 1; 15 } 16 int is_map(int i,int j)//边界判断 17 { 18 if(i >= 0&& i < 4 && j >= 0&& j < 4) 19 return 1; 20 return 0; 21 } 22 void reverse(int i,int j)//翻转 23 { 24 if(is_map(i,j)) 25 map[i][j] = (map[i][j]+1)%2; 26 if(is_map(i,j-1)) 27 map[i][j-1] =(map[i][j-1]+1)%2; 28 if(is_map(i,j+1)) 29 map[i][j+1] =(map[i][j+1]+1)%2; 30 if(is_map(i+1,j)) 31 map[i+1][j] =(map[i+1][j]+1)%2; 32 if(is_map(i-1,j)) 33 map[i-1][j] =(map[i-1][j]+1)%2; 34 35 36 return ; 37 } 38 void search(int i,int j,int step) 39 { 40 int x1,x2,y1y2; 41 42 if(pan()) 43 { 44 if(ans > step) 45 ans = step; 46 return; 47 } 48 if(is_map(i,j) == 0) 49 return; 50 if(j < 3 && i >=0 && i <= 3)//这个子不翻翻下一个 51 { 52 search(i,j+1,step); 53 } 54 else 55 { 56 if(i <= 3) 57 { 58 search(i+1,0,step);// 59 } 60 } 61 reverse(i,j);//翻这个子 62 if(j < 3 && i >=0 && i <= 3)//翻这个子。 63 { 64 search(i,j+1,step+1); 65 } 66 else 67 { 68 if(i <= 3) 69 { 70 search(i+1,0,step+1); 71 72 } 73 } 74 reverse(i,j);//反回来,算是回溯。 75 76 } 77 int main() 78 { 79 int i,j; 80 for(i = 0;i < 4;i++) 81 { 82 scanf("%s",map[i]); 83 } 84 for(i = 0;i < 4;i++) 85 for(j = 0;j < 4;j++) 86 if(map[i][j] == 'b') 87 map[i][j] = 1; 88 else 89 map[i][j] = 0; 90 search(0,0,0); 91 if(ans != 10000) 92 printf("%d\n",ans); 93 else 94 printf("Impossible\n"); 95 return 0; 96 }