1.思路分析
暴力枚举,枚举所有可能的情况
2.方法设计及性能衡量
用位运算加速,由于最高循环为2^16-1,所以时间不会超时。
3.实现部分
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int a=0,b[5][5],t[5][5],min;
char temp[5][5];
void change(int a1,int a2){
if(a2==0)a2=4;
b[a1][a2]=!b[a1][a2];
b[a1][a2-1]=!b[a1][a2-1];
b[a1][a2+1]=!b[a1][a2+1];
b[a1-1][a2]=!b[a1-1][a2];
b[a1+1][a2]=!b[a1+1][a2];
}
int judge(){
int i,j;
for(i=1;i<=4;i++){
for(j=1;j<=4;j++){
if(b[i][j]!=b[1][1])return 0;
}
}
return 1;
}
void restart(){
int i,j;
for(i=1;i<=4;i++){
for(j=1;j<=4;j++){
b[i][j]=t[i][j];
}
}
}
void fun(){
int i,count=0;
restart();
int j;
for(i=0;i<16;i++){
if(a&(1<<i)){
change(i/4+1,(i+1)%4);
count++;
}
}
if(judge()){
min=min>count?count:min;
}
}
int scan(){
int i,j=0;
for(i=1;i<=4;i++){
scanf("%s",temp[i]);
for(j=0;j<=3;j++){
if(temp[i][j]=='w')t[i][j+1]=0;
if(temp[i][j]=='b')t[i][j+1]=1;
}
}
return 1;
}
int main(){
scan();
min=17;
for(a=0;a<=65535;a++)fun();
if(min<=16)
printf("%d\n",min);
else printf("Impossible\n");
return 0;
}