dfs,搜索所有的操作方法,O(2^16)
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> using namespace std; bool map[4][4]; int ans = 100; void init() { int i, j; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { char ch; cin >> ch; if (ch == 'b') map[i][j] = true; else map[i][j] = false; } getchar(); } } void operate(int x, int y) { if (x < 0 || y < 0 || x > 3 || y > 3) return; map[x][y] = !map[x][y]; } void turn(int pos) { int x = pos / 4; int y = pos % 4; operate(x, y); operate(x + 1, y); operate(x, y + 1); operate(x - 1, y); operate(x, y - 1); } bool finished() { int tot = 0; int i; for (i = 0; i < 16; i++) tot += map[i / 4][i % 4]; return ((tot % 16) == 0); } void dfs(int pos, int step) { if (finished()) { if (ans > step) ans = step; return; } if (pos >= 16) return; dfs(pos + 1, step); turn(pos); dfs(pos + 1, step + 1); turn(pos);//这句忘了写,导致错误 } int main() { //freopen("D:\\t.txt", "r", stdin); init(); dfs(0, 0); if (ans == 100) cout << "Impossible" << endl; else cout << ans << endl; return 0; }