思路和其他人一样,不过没有复杂的位运算,比较好懂
卡了半天,发现忘记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; }