暴搜。。。每个状态16种操作。终于过了。。。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char map[5][5];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int step,flag;
/*void flip(int a,int b)
{
if(map[a][b]=='+') map[a][b]='-';
else if(map[a][b]=='-') map[a][b]='+';
for(int i=0;i<4;i++)
{
int x=a;
int y=b;
while(x>0&&x<5&&y>0&&y<5)
{
x+=dir[i][0];
y+=dir[i][1];
if(map[x][y]=='+') map[x][y]='-';
else if(map[x][y]=='-') map[x][y]='+';
}
}
}*/
void flip(int a,int b)
{
if(map[a][b]=='b') map[a][b]='w';
else map[a][b]='b';
for(int i=0;i<4;i++)
{
int x=a+dir[i][0];
int y=b+dir[i][1];
if(x>0&&x<5&&y>0&&y<5)
{
if(map[x][y]=='b') map[x][y]='w';
else map[x][y]='b';
}
}
}
int judge()
{
int s=1;
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
if(map[i][j]!=map[1][1])
s=0;
}
}
return s;
}
void dfs(int row,int col,int deep)
{
if(deep==step)
{flag=judge();return;}
if(flag||row==5) return;
flip(row,col);
/*if(judge())
{
flag=1;return;
}*/
if(col<4)
dfs(row,col+1,deep+1);
else
dfs(row+1,1,deep+1);
flip(row,col);
if(col<4)
dfs(row,col+1,deep);
else
dfs(row+1,1,deep);
return;
}
int main()
{
for(int i=1;i<=4;i++)
{
scanf("%s",map[i]+1);
}
/*for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
printf("%c",map[i][j]);
}printf("\n");
}*/
for(step=0;step<=16;step++)
{
dfs(1,1,0);
if(flag) break;
}
if(flag) printf("%d\n",step);
else printf("Impossible\n");
return 0;
}