#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#include <vector>
#include <set>
#include <string>
#include <cstring>
#define INT_MIN 0x80000000
#define INT_MAX 0xffffffff
#define N 1000
#define MAX(a,b) (a)>(b)?(a):(b)
#define MIN(a,b) (a)<(b)?(a):(b)
#define LL long long
#define debug(x) cout<<#x<<":"<<(x)<<endl;
using namespace std;
bool chess[6][6] = {false}; // initail
bool flag;
int step;
// four dir
int r[] = {-1,1,0,0,0};
int c[] = {0,0,-1,1,0};
bool judge_all() // all color
{
for(int i=1; i<5; i++)
for(int j=1; j<5; j++)
if( chess[i][j] != chess[1][1] ) return false;
return true;
}
void flip(int row, int col)
{
for (int i=0; i<5; i++)
chess[row + r[i]][col + c[i]] = !chess[row + r[i]][col + c[i]];
return;
}
void dfs(int row, int col, int deep)
{
if( step == deep)
{
flag = judge_all();
return ;
}
if( flag || row==5 ) return ;
// 翻
flip(row, col);
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);
}
int main()
{
//freopen("1.txt", "r", stdin);
//freopen("11.txt", "w", stdout);
ios::sync_with_stdio(false);
// input
char temp;
for( int i=1; i<5; i++)
for(int j=1; j<5; j++)
{
cin >> temp;
if( temp == 'b')
chess[i][j] = true;
}
for( step=0; step<=16; step++)
{
dfs(1,1,0);
if( flag ) break;
}
if( flag )
cout<<step<<endl;
else
cout<<"Impossible"<<endl;
return 0;
}
POJ1753
最新推荐文章于 2020-01-22 12:03:42 发布