题意为有一个4*4的棋盘棋子为黑或白,可以任意选择一个点将这个点和上下左右变为相反的颜色,问最少的操作次数可以将棋盘中的棋子是一个颜色。
思路 可以发现对于一个点,要不选择一次,要不一次也不选择,选两次可以发现和不选择是一个效果,选择3次和一次也是一个效果,自然可以想到二进制枚举每种情况,选择最小值即可。

#include<iostream>
using namespace std;
char a[5][5],b[5][5];
int dx[5]={0,0,1,0,-1},dy[5]={0,1,0,-1,0},ans=20;
void init()
{
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
            b[i][j]=a[i][j];
    return;
}
int main()
{
    for(int i=0;i<4;i++)
        cin>>a[i];
    for(int i=0;i<1<<16;i++)
    {
        int f=0;
        init();
        for(int j=0;j<16;j++)
        {
            if(i>>j&1)
            {
                f++;
                int hang=j/4;
                int lie=j-hang*4;
                for(int k=0;k<5;k++)
                {
                    if(hang+dx[k]>=0&&hang+dx[k]<4&&lie+dy[k]>=0&&lie+dy[k]<4)
                    {
                        if(b[hang+dx[k]][lie+dy[k]]=='b')b[hang+dx[k]][lie+dy[k]]='w';
                        else b[hang+dx[k]][lie+dy[k]]='b';
                    }
                }
            }
        }
        int numb=0,numw=0;
        for(int j=0;j<4;j++)
            for(int k=0;k<4;k++)
                if(b[j][k]=='b')numb++;
        else numw++;
        if(numb==16||numw==16)
            ans=min(ans,f);
    }
    if(ans!=20)
    cout<<ans<<endl;
    else cout<<"Impossible"<<endl;
}