枚举第一行可能出现的翻转情况,然后第二行的翻转为使第一行变成一种颜色,第三行的翻转情况为使第二行变为一种颜色,第四行的翻转情况为使第三行变为一种颜色,最后检测第四行是否也全部为一种颜色。 #include <iostream> using namespace std; #define Min(x,y) (x<y?x:y) bool field[6][6]; bool tempfield[6][6]; bool tempfield2[6][6]; void tran(int i,int j,bool k[6][6]) { k[i][j]=!k[i][j]; k[i][j+1]=!k[i][j+1]; k[i][j-1]=!k[i][j-1]; k[i+1][j]=!k[i+1][j]; k[i-1][j]=!k[i-1][j]; } bool check(bool k[],bool c) { for(int i=1;i<=4;i++) { if(k[i]!=c) return false; } return true; } int main() { char temp[5]; int cnt,cnt2,min_cnt=0xffff+1; memset(field,0,sizeof(field)); for(int i=0;i<4;i++) { scanf("%s",temp); for(int j=0;j<4;j++) { if(temp[j]=='b') field[i+1][j+1]=true; } } for(int i=0;i<16;i++) { memcpy(tempfield,field,sizeof(field)); memcpy(tempfield2,field,sizeof(field)); cnt=cnt2=0; for(int j=0;j<4;j++) { if((i>>j)&1) { tran(1,4-j,tempfield); tran(1,4-j,tempfield2); cnt++; cnt2++; } } for(int j=2;j<=4;j++) { for(int k=1;k<=4;k++) { if(tempfield[j-1][k]) tran(j,k,tempfield),cnt++; if(!tempfield2[j-1][k]) tran(j,k,tempfield2),cnt2++; } } if(check(tempfield[4],false)) min_cnt=Min(min_cnt,cnt); if(check(tempfield2[4],true)) min_cnt=Min(min_cnt,cnt2); } if(min_cnt==0xffff+1) printf("Impossible/n"); else printf("%d/n",min_cnt); return 0; }