链接:http://vjudge.net/problem/viewProblem.action?id=16122
赶时间,参考了别人的代码
#include <iostream>
#include <cstring>
using namespace std;
int st,map[6][6];
int dir[4][2] = {0,1,0,-1,1,0,-1,0};
bool flag;
void init()
{
memset(map,0,sizeof(map));
flag = 0;
for(int i = 1;i <= 4;++i)
{
for(int j = 1;j <= 4;++j)
{
char ch;
cin>>ch;
if(ch == 'b') map[i][j] = 1;
}
}
}
//判断是否到达成功状态
bool isSuccess()
{
int cmp = map[1][1];
for(int i = 1;i <= 4;++i)
{
for(int j = 1;j <= 4;++j)
{
if(map[i][j] != cmp) return false;
}
}
return true;
}
//翻转对应区域
void flip(int r,int c)
{
map[r][c] = !map[r][c];
for(int i = 0;i < 4;++i)
{
int t1 = r + dir[i][0];
int t2 = c + dir[i][1];
map[t1][t2] = !map[t1][t2];
}
}
void dfs(int r,int c,int cur)
{
if(cur == st)
{
if(isSuccess())
flag = 1;
return;
}
if(flag || r == 5) return;
//选择对当前位置翻转一次
flip(r,c);
if(c < 4) dfs(r,c+1,cur+1);
else dfs(r+1,1,cur+1);
//选择对当前位置不翻转,翻转两次相当于回到原来的状态
flip(r,c);
if(c < 4) dfs(r,c+1,cur);
else dfs(r+1,1,cur);
return;
}
void solve()
{
//i 为翻转几次,对每一步穷举状态
for(int i = 0;i <= 16;++i)
{
st = i;
dfs(1,1,0);
if(flag)
break;
}
if(flag) cout<<st<<endl;
else cout<<"Impossible"<<endl;
}
int main()
{
init();
solve();
return 0;
}