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

京公网安备 11010502036488号