棋盘是4*4的,每个位置只有翻转和不翻转两种选择,总共2^16中选择,暴力枚举即可。用位运算来模拟翻转的位置。
//Memory: 120K
//Time: 219MS
#include <stdio.h>
int min(int a,int b)
{
return a<b?a:b;
}
int main()
{
char c;
int p[17],t[17];
int i,j,k,sum=0,minn=20;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
scanf("%c",&c);
if(c=='b')
p[i*4+j]=1;
else
p[i*4+j]=0;
}
getchar();
}
for(i=0;i<16;i++)
t[i]=p[i];
for(i=0;i<=65536;i++)
{
k=i;
sum=0;
for(j=0;j<16;j++)
{
if((k&1)==1)
{
sum++;
t[j]^=1;
if(j>3)
t[j-4]^=1;
if(j<12)
t[j+4]^=1;
if(j%4!=0)
t[j-1]^=1;
if(j%4!=3)
t[j+1]^=1;
}
k=k>>1;
}
for(j=0;j<15;j++)
if(t[j]!=t[j+1])
break;
if(j==15)
minn=min(sum,minn);
for(j=0;j<16;j++)
t[j]=p[j];
}
if(minn==20)
printf("Impossible\n");
else
printf("%d\n",minn);
return 0;
}