思路和其他人一样,不过没有复杂的位运算,比较好懂
卡了半天,发现忘记k++;
woc

#include<iostream>
#include<string>
#include<vector>
#include<cmath>
#include<algorithm>

using namespace std;


int enum1(int i, vector< vector<int> > b, int mk) {
    int cnt = 0; int k = 0;
    for (int j = 1 << 3; j > 0; j = (j >> 1)) {
        if ((i & j) != 0 && k < 4) {
            cnt++;
            if (k + 1 < b[0].size()) b[0][k + 1] = !b[0][k + 1];   //右
            if (k - 1 >= 0) b[0][k - 1] = !b[0][k - 1];      //左边
            b[1][k] = !b[1][k];                     //下边
            b[0][k] = !b[0][k];                   //自己
        }
        k++;
    }

    for (int h = 1; h < b.size(); h++) {
        for (int j = 0; j < b[h].size(); j++) {                                     //如果不是要求的颜色反转
            if (b[h - 1][j] != mk) {
                cnt++;
                if (j + 1 < b[h].size()) b[h][j + 1] = !b[h][j + 1];            //右边
                if (j - 1 >= 0)          b[h][j - 1] = !b[h][j - 1];            //左边
                if (h + 1 < b.size())    b[h + 1][j] = !b[h + 1][j];            //下边
                b[h][j] = !b[h][j];                                             //自己
                b[h - 1][j] = !b[h - 1][j];                                     //上边
            }
        }
    }

    int sum = 0;
    for (int j = 0; j < 4; j++) {
        sum = sum + b[3][j];
    }
    if (sum != mk * 4) return -2;
    return cnt;
}

int main() {

    vector<vector<int>> a(4, vector<int>(4));
    char c; int sum = 0;                                                          //读数据
    for (int i = 0; i < a.size(); i++) {
        for (int j = 0; j < a[i].size(); j++) {
            cin >> c;
            if (c == 'b') a[i][j] = 0;
            else a[i][j] = 1;
            sum = sum + a[i][j];
        }
    }
    //如果初始满足状态返回 0
    if (sum == 0 || sum == 16) {
        cout << 0;
        return 0;
    }

    int minx = 99999, temp;
    //开始枚举第一排的16种情况,这是我第一次使用位运算, 有点忐忑
    for (int i = 0; i <= (1 << 4) - 1; i++) {
        temp = enum1(i, a, 1);                                        // 定义如果返回的是小于0 的 复数证明这个case 是不可解的 跳过 测试下一case
        if (temp > 0) minx = min(minx, temp);
        temp = enum1(i, a, 0);
        if (temp > 0) minx = min(minx, temp);
    }

    if (minx == 99999) cout << "Impossible";
    else cout << minx << endl;;

    return 0;
}