记录编号 43343 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2010冲刺七]翻转游戏 最终得分 100
用户昵称 Gravatar王者自由 是否通过 通过
代码语言 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;
}