对于每个格子只有两种情况, 翻与不翻, 共有216=65536种方法.
DFS即可.
相比于某些狂人数百行的代码, 我的还算比较简洁......
#include<iostream> #define INF 0X7FFFFFFF using namespace std; int A[6][6]; char s[4][8]; int T[17][2]= { {0,0}, {1,1},{1,2},{1,3},{1,4}, {2,1},{2,2},{2,3},{2,4}, {3,1},{3,2},{3,3},{3,4}, {4,1},{4,2},{4,3},{4,4}, }; int mini=INF; bool check() { int i,j; int temp=A[1][1]; for(i=1;i<5;i++) for(j=1;j<5;j++) if(A[i][j]!=temp) return false; return true; } void flip(int x,int y) { A[x][y]=1-A[x][y]; A[x+1][y]=1-A[x+1][y]; A[x-1][y]=1-A[x-1][y]; A[x][y+1]=1-A[x][y+1]; A[x][y-1]=1-A[x][y-1]; return; } void dfs(int n,int num) { int i,j; if(check()) { if(num<mini) mini=num; return; } if(n>16) return; dfs(n+1,num); flip(T[n][0],T[n][1]); dfs(n+1,num+1); flip(T[n][0],T[n][1]); return; } int main() { int i,j,k; scanf("%s%s%s%s",s[0],s[1],s[2],s[3]); for(i=0;i<4;i++) for(j=0;j<4;j++) if(s[i][j]=='w') A[i+1][j+1]=0; else A[i+1][j+1]=1; dfs(1,0); if(mini<17) printf("%d/n",mini); else printf("Impossible/n"); return 0; }
疯狂的试炼造就了我还算可以的DFS代码工整程度......