用的是二进制枚举,感觉自己写的有点麻烦,大家稍微借鉴一下就好了。
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int map[10][10];
char c[10][10];
int cur[10][10];
int cur1[10][10];
int cur2[10][10];
int sum = 0;
int min1 = 999999;
int num = (1 << 4);
void deal()
{
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            if (c[i][j] == 'b')
                map[i + 1][j + 1] = 1;
            else if (c[i][j] == 'w')
                map[i + 1][j + 1] = 0;
        }
    }
}
void Flip(int i, int j, int (*a)[10])//翻转棋子。
{
    if (a[i][j] == 0)
        a[i][j] = 1;
    else if (a[i][j] == 1)
        a[i][j] = 0;
}
int getbit(int i, int n)
{
    return (n >> i) & 1;
}
int solve1()    //枚举剩下的行,但全部翻转为1
{
    int ss = 0;
    for (int i = 2; i <= 4; i++)
    {
        for (int j = 1; j <= 4; j++)
        {
            if (cur1[i - 1][j] == 0)
            {
                ss++;
                Flip(i, j, cur1);
                Flip(i - 1, j, cur1);
                if (j > 1)
                    Flip(i, j - 1, cur1);
                if (j < 4)
                    Flip(i, j + 1, cur1);
                if (i < 4)
                    Flip(i + 1, j, cur1);
            }
        }
    }
    int u = cur1[4][1] + cur1[4][2] + cur1[4][3] + cur1[4][4];
    if (u == 4)
        return ss;
    return 0;
}
int solve2()//枚举剩下的行全部翻转为0
{
    int ss = 0;
    for (int i = 2; i <= 4; i++)
    {
        for (int j = 1; j <= 4; j++)
        {
            if (cur2[i - 1][j] == 1)
            {
                ss++;
                Flip(i, j, cur2);
                Flip(i - 1, j, cur2);
                if (j > 1)
                    Flip(i, j - 1, cur2);
                if (j < 4)
                    Flip(i, j + 1, cur2);
                if (i < 4)
                    Flip(i + 1, j, cur2);
            }
        }
    }
    int u = cur2[4][1] + cur2[4][2] + cur2[4][3] + cur2[4][4];
  //  cout << u << ends;
    if (u == 0)
        return ss;
    return 0;
}
int main()
{
    for (int i = 0; i < 4; i++)
    {
        cin >> c[i];
    }
    deal();
    int sss = 0;
    for (int i = 1; i <= 4;i++){
        for (int j = 1; j <= 4;j++){
            sss += map[i][j];
        }
    }
    if(sss==0||sss==16){    //如果给的输入直接全部同色,则结束。
        cout << 0 << endl;
        return 0;}
        for (int i = 0; i < num; i++)//枚举第一行
        {
            memcpy(cur, map, sizeof(map));
            sum = 0;
            int switchs = i;
            for (int j = 1; j <= 4; j++)
            {
                int _on = getbit(j - 1, switchs);
                if (_on)
                {
                    sum++;
                    Flip(1, j, cur);
                    Flip(2, j, cur);
                    if (j > 1)
                        Flip(1, j - 1, cur);
                    if (j < 4)
                        Flip(1, j + 1, cur);
                }
            }
            memcpy(cur1, cur, sizeof(cur));
            memcpy(cur2, cur, sizeof(cur));
            int u = solve1();
            if (u != 0)
            {
                if (u + sum < min1)
                    min1 = u + sum;
            }
            int u2 = solve2();
            if (u2 != 0)
            {
                if (u2 + sum < min1)
                    min1 = u2 + sum;
            }
        }
    if(min1!=999999)
    cout << min1 << endl;
    else
        cout << "Impossible" << endl;
}