题意:给出初始的棋盘,每按一个地方周围上下左右都要翻转,求全部翻转成同样颜色的最小步骤;
可以先把棋盘转化为01棋盘 a数组装黑***r> 例如
bwbw
wwww
bbwb
bwwb
a数组为
0101
0000
1101
1001

#include<cstdio>
#include<cstring>
using namespace std;
const int N=5;
char g[N][N],a[N][N],b[N][N];
int dx[5]={-1,0,1,0,0},dy[5]={0,1,0,-1,0};

void turn (int x,int y)//翻转函数
{
    for(int i=0;i<5;i++)
    {
        int a=x+dx[i];
        int b=y+dy[i];
        if(a>=4||a<0||b<0||b>=4) continue;
        g[a][b]^=1;//0和1的转换
    }
}

int solve(char c[][5])
{
    int res=100000000;
  for(int op=0;op<16;op++)
  {  int cnt=0;
      memcpy(g,c,sizeof g);
      //处理第一行棋子
      for(int i=0;i<4;i++)
        if(op>>i&1)
      {
          turn(0,i);
          cnt++;
      }
      //处理1~3行棋子
      for(int i=0;i<3;i++)
        for(int j=0;j<4;j++)
      {
          if(g[i][j]=='0')
          {
              turn(i+1,j);
              cnt++;
          }
      }
      //检查最后一行棋子是否成功;
      bool flag=true;
      for(int i=0;i<4;i++)
        if(g[3][i]=='0') flag=false;
        //成功更新答案
      if(flag&&res>cnt) res=cnt;


  }
     return res;
}

int main()
{
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
    {
        char c;
        cin>>c;
        if(c=='b') {a[i][j]='1';b[i][j]='0';}
        else {b[i][j]='1';a[i][j]='0';}
    }
    int res;
    res=solve(a);
    res=min(res,solve(b));
    if(res<100000000)
    cout<<res<<endl;
    else puts("Impossible");
    return 0;
}