标签:
POJ 1753,题目链接http://poj.org/problem?id=1753.
总共有16个点。对某个点选择操作或者不操作。一共有2^16次方种可能。
从前往后枚举,保证不重复。
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<algorithm> 5 #include<vector> 6 7 using namespace std; 8 int matrix[4][4]; 9 int dx[]={0,1,0,-1}; 10 int dy[]={1,0,-1,0}; 11 int ans,flag1=0; 12 int ans_min; 13 14 void dfs(int m,int n) 15 { 16 int find=0; 17 if(flag1) 18 return; 19 for(int i=0;i<4;i++) 20 { 21 for(int j=0;j<4;j++) 22 if(matrix[i][j]!=matrix[0][0]) 23 { 24 find=1; 25 break; 26 } 27 if(find) 28 break; 29 } 30 if(!find) 31 { 32 flag1=1; 33 return ; 34 } 35 if(ans_min<=ans||m==4) 36 return ; 37 for(int i=m;i<4;i++) 38 for(int j=n;j<4;j++) 39 { 40 ans++; 41 matrix[i][j]=!matrix[i][j]; 42 for(int k=0;k<4;k++) 43 { 44 if(0<=i+dy[k]&&i+dy[k]<=3&&0<=j+dx[k]&&j+dx[k]<=3) 45 matrix[i+dy[k]][j+dx[k]]=!matrix[i+dy[k]][j+dx[k]]; 46 } 47 48 dfs(i+(j+1)/4,(j+1)%4); 49 50 ans--; 51 matrix[i][j]=!matrix[i][j]; 52 for(int k=0;k<4;k++) 53 { 54 if(0<=i+dy[k]&&i+dy[k]<=3&&0<=j+dx[k]&&j+dx[k]<=3) 55 matrix[i+dy[k]][j+dx[k]]=!matrix[i+dy[k]][j+dx[k]]; 56 } 57 } 58 } 59 60 int main() 61 { 62 char a; 63 for(int i=0;i<4;i++) 64 { 65 for(int j=0;j<4;j++) 66 { 67 scanf("%c",&a); 68 if(a==‘w‘) 69 matrix[i][j]=0; 70 else 71 matrix[i][j]=1; 72 } 73 getchar(); 74 } 75 76 for(ans_min=0;ans_min<=16;ans_min++) 77 { 78 dfs(0,0); 79 if(flag1) 80 { 81 printf("%d\n",ans_min); 82 break; 83 } 84 } 85 if(!flag1) 86 printf("Impossible\n"); 87 return 0; 88 }
标签:
原文地址:http://www.cnblogs.com/onlyAzha/p/4522110.html