题目描述:4*4黑白棋盘,点击一个棋子,则它的四周及本身变化颜色,求变为纯色的最短步数。 方法:用BFS求最短步数,Bit存储状态,共有2^16=65536种状态。 #include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; bool visit[65536]; // 共有2^16个状态 int dir[4][2] = {{0,1}, {-1,0}, {0,-1}, {1,0}}; int change[16]; // 根据dir[4][2]确定变化位状态, 通过异或 struct Node { int state; int step; }; void initChange() { int x, y, state, temp; for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { state = 0; state = 1 << (3-i)*4+3-j; for (int t = 0; t < 4; ++t) { x = i + dir[t][0]; y = j + dir[t][1]; if (x < 0 || x > 3 || y < 0 || y > 3) { continue; } else { state ^= 1 << (3-x)*4+3-y; } } change[i*4+j] = state; } } } int bfs(int state) { queue<Node> q; Node cur, next; cur.state = state; cur.step = 0; q.push(cur); memset(visit, false, sizeof(visit)); if (cur.state == 0 || cur.state == 0xffff) // 初始就是全w或b的情况 return cur.step; while (!q.empty()) { cur = q.front(); q.pop(); for (int i = 0; i < 16; ++i) { // bfs next.state = cur.state ^ change[i]; next.step = cur.step + 1; if (visit[next.state]) continue; if (next.state == 0 || next.state == 0xffff) return next.step; visit[next.state] = true; q.push(next); } } return -1; } int main() { int state, ans; char ch[4][4]; freopen("temp.txt", "r", stdin); initChange(); state = 0; for (int i = 0; i < 4; ++i) { scanf("%s", ch[i]); for (int j = 0; j < 4; ++j) { if (ch[i][j] == 'b') { state ^= 1 << (3-i)*4+3-j; } } } ans = bfs(state); if (ans == -1) puts("Impossible"); else cout << ans << endl; return 0; }