记录编号 |
43343 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NOIP 2010冲刺七]翻转游戏 |
最终得分 |
100 |
用户昵称 |
王者自由 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.089 s |
提交时间 |
2012-10-09 22:13:17 |
内存使用 |
3.34 MiB |
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
char G[4][4], T[8][8];
int Ten() {
int s = 0, k = 1;
for(int i=0; i<4; i++)
for(int j=0; j<4; j++) {
s += k * T[i+2][j+2];
k <<= 1;
}
return s;
}
int Get(int k, int x, int y) {
for(int i=0; i<4; i++)
for(int j=0; j<4; j++) {
T[i+2][j+2] = k % 2;
k /= 2;
}
x += 2, y += 2; T[x][y] ^= 1;
T[x-1][y] ^= 1; T[x][y-1] ^= 1;
T[x+1][y] ^= 1; T[x][y+1] ^= 1;
return Ten();
}
const int N = 65536;
bool v[N] = {0};
struct state {
int s, c;
} e;
queue<state> q;
bool BFS(int s) {
memset(v, 0, sizeof(v));
e.s = s, e.c = 0;
v[s] = 1; q.push(e);
while(!q.empty()) {
state u = q.front(); q.pop();
for(int i=0; i<4; i++)
for(int j=0; j<4; j++) {
int k = Get(u.s, i, j);
if(!v[k]) {
e.s = k, e.c = u.c + 1;
v[k] = 1; q.push(e);
if(k == 0 || k == 65535) {
printf("%d\n", e.c);
return true;
}
}
}
} return false;
}
int main() {
freopen("flip.in", "r", stdin);
freopen("flip.out", "w", stdout);
for(int i=0; i<4; i++)
scanf("%s\n", G[i]);
for(int i=0; i<4; i++)
for(int j=0; j<4; j++)
T[i+2][j+2] = (G[i][j] == 'b' ? 0 : 1);
int s = Ten();
if(s == 0 || s == 65535)
printf("%d\n", 0);
else if(!BFS(s))
printf("Impossible\n");
return 0;
}