#include<stdio.h>
#include<string.h>
#include<iostream>
char str[4];
int bit[16];
int result[16];
int hm;
int ok;
using namespace std;
int check()
{
for(int i=1;i<16;i++)
if(bit[i]!=bit[i-1])
{
return 0;
}
return 1;
}
void changecolor(int i)
{
bit[i]=!bit[i];
int x=i/4;
int y=i%4;
if(y<3) bit[i+1]=!bit[i+1];
if(y>0) bit[i-1]=!bit[i-1];
if(x>0) bit[i-4]=!bit[i-4];
if(x<3) bit[i+4]=!bit[i+4];
}
void combine(int start,int hm,int len)
{
if(ok==1) return;
for(int i=start;i>=hm;i--)
{
result[hm-1]=i-1; //result的值为要反转的格子
if(hm>1) combine(i-1,hm-1,len); //当反转格子数大于一时 递归给result赋值 层层遍历所有可能
else
{
for(int j=0;j<len;j++)
changecolor(result[j]);
if(check())
{
ok=1;
printf("%d\n",len);
break;
}
else
{
for(int j=0;j<len;j++)
changecolor(result[j]);
}
}
}
return;
}
int main(void)
{
int line=4;
int k=0;
hm=0;
ok=0; //判断是否得到解
while(line--)
{
scanf("%s",str);
for(int i=0;i<4;i++)
{
if(str[i]=='b')
bit[k++]=1;
else if(str[i]=='w')
bit[k++]=0;
}
}
if(check())
{
printf("0\n");
}
else
{
for(int i=1;i<=16;i++)
combine(16,i,i); //i反转的格子数
if(ok==0) printf("Impossible\n");
}
return 0;
}
因为每个棋子要么不翻(0)要么翻一次(1)所以最多翻16个 枚举所有情况