[bfs] poj 1753 Flip Game# bfs + 位存储

来源:互联网 发布:游戏宣传片制作软件 编辑:程序博客网 时间:2024/05/17 23:26
/**[bfs] poj 1753 Flip Game# bfs + 位存储4 * 4 的黑白棋,每次翻动一个及其四周的棋子,问到达终态全白或全黑的最少步数。终于吃了一次define不加()的大亏了。define 相当于同义替换,先 define MAXN 1 << 16然后 MAXN - 1 时优先级就出问题了*/#include <stdio.h>#include <queue>using namespace std;#define N 17#define MAXN (1<<16)int bit[N];int vis[MAXN],src;int move[5][2] = {0,0,0,1,1,0,0,-1,-1,0};int bfs(){    if(src == 0 || src == (MAXN - 1))        return 0;    queue<int> que;    que.push(src);    vis[src] = 1;    int i,j,k,x,y,p,pt;    while(!que.empty())    {        p = que.front();        que.pop();        for(i = 0; i < 4; ++i)            for(j = 0; j < 4; ++j)            {                pt = p;                for(k = 0; k < 5; ++k)                {                    x = i + move[k][0];                    y = j + move[k][1];                    if(x >= 0 && x < 4 && y >= 0 && y < 4)                        pt ^= bit[x * 4 + y];                }                if(pt == 0 || pt == MAXN - 1)                    return vis[p];                if(vis[pt] == 0)                {                    vis[pt] = vis[p] + 1;                    que.push(pt);                }            }    }    return -1;}int main(){    char mat[5][5];    int i,j;    for(i = 0; i < N; ++i)        bit[i] = 1 << i;    src = 0;    for(i = 0; i < 4; ++i)    {        scanf("%s",mat[i]);        for(j = 0; j < 4; ++j)            if(mat[i][j] == 'b')                src |= bit[i * 4 + j];    }    int res = bfs();    printf(res == -1 ? "Impossible\n":"%d\n",res);    return 0;}

原创粉丝点击