POJ 1753 - Flip Game (位运算 + BFS)

原创 2016年08月29日 21:31:25

题目链接:

http://poj.org/problem?id=1753

题意:

给一个4x4的棋盘,每次可以翻其中一个棋子,这个棋子上下左右的棋子也会被翻过来,问何时可以达到全白或全黑的状态。

题解:

此题可以将棋盘上的状态转化为一个数字去存。将棋盘上状态看成一个2进制的数,1代表黑色0代表白色,可以翻的16个地方记做移动步数,这样只要把每次状态与这16种走法作异或运算即是翻过去的下一种状态。
BFS即可。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;

struct Node
{
    int state, step;
};

int vis[65536];

int mov[16] =   //16种状态转换,对应4*4的翻子位置
{
     51200,58368,29184,12544,
     35968,20032,10016,4880,
     2248,1252,626,305,
     140,78,39,19
};

int bfs(int state)
{
    queue <Node> q;
    memset(vis,0,sizeof(vis));
    Node cur,next;
    cur.state = state;
    cur.step = 0;
    q.push(cur);
    vis[cur.state] = 1;
    while(!q.empty())
    {
        cur = q.front();
        q.pop();
        if(cur.state == 0 || cur.state == 65535)
            return cur.step;
        for(int i = 0; i < 16; i++)
        {
            next.state = cur.state ^ mov[i];
            next.step = cur.step + 1;
            if(vis[next.state])
                continue;
            if(next.state == 0 || next.state == 65535)
                return next.step;
            vis[next.state] = 1;
            q.push(next);
        }
    }
    return -1;
}

int main()
{
    char ch[5][5];
    while(~scanf("%s",ch[0]))
    {
        for(int i = 1 ; i < 4 ; i++)
            scanf("%s",ch[i]);
        int state = 0,bits = 0;
        for(int i = 3 ; i >= 0 ; i--)
        {
            for(int j = 3 ; j >= 0 ; j--)
            {
                if(ch[i][j] == 'b')
                    state += (1 << bits);
                bits++;
            }
        }
        int ans = bfs(state);
        if(ans == -1)
            puts("Impossible");
        else
            printf("%d\n",ans);
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

poj 1753 Flip Game(枚举,bfs)(简单)

poj 1753 Flip Game题目http://poj.org/problem?id=1753 给你一个4*4的棋盘,每个棋子非黑即白,翻一个棋子会带动它上下左右的棋子也翻过来,问至少多少...
  • pibaixinghei
  • pibaixinghei
  • 2016年04月25日 16:59
  • 1242

POJ 1753(DFS+枚举||BFS+位运算)

题目链接http://poj.org/problem?id=1753 题意:给出一个4*4方格,b表示黑棋,w表示白棋,每次选定一个棋子,将其以及相邻点翻转,需要多少次才能使棋子全为白色或者黑色?...
  • rachelsg
  • rachelsg
  • 2016年01月23日 10:26
  • 355

POJ 1753 Flip Game (DFS 太暴力了!)

Flip Game Description Flip game is played on a rectangular 4x4 field with two-sided pieces pla...
  • u013476556
  • u013476556
  • 2014年06月14日 20:22
  • 3323

poj-1753 Flip Game

Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34300   Accepted: 14985 ...
  • chAngE_AC
  • chAngE_AC
  • 2015年07月28日 20:58
  • 262

poj 1753Flip Game---枚举

Description Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of i...
  • RIPwangh
  • RIPwangh
  • 2015年07月27日 21:32
  • 341

poj 1753 Flip Game(位运算+bfs)

http://poj.org/problem?id=1753 题意:给一个只含‘b’和‘w’的4*4的棋盘,当翻一个格子时,它上下左右的格子也要翻转,问最少需要多少步使棋盘全是‘b’或‘w’。 因...
  • u013081425
  • u013081425
  • 2014年04月20日 12:53
  • 902

POJ 1753 - 位运算(异或)+BFS / DFS+枚举

1.Question: 题目大意: 有一个4*4的棋盘,棋盘上有黑白子,我们对棋盘进行如下操作: 操作的定义:我们每次可以反转一个棋子,即黑变白,白变黑,之后上下左右四个方向的棋子都会跟着进行翻转操作...
  • ltyqljhwcm
  • ltyqljhwcm
  • 2016年10月24日 09:22
  • 424

POJ 1753 Flip Game ------- BFS & 位运算

翻牌游戏,中间一个和上下左右全部反过来,知道全白或者全黑为止。 #include using namespace std; int visited[65536]; int queue[6553...
  • huahuahailang
  • huahuahailang
  • 2013年03月14日 12:54
  • 581

POJ1753--Flip Game(枚举)

Do more with lessDescription Flip game is played on a rectangular 4x4 field with two-sided pieces ...
  • Dorlife
  • Dorlife
  • 2017年08月09日 21:33
  • 216

poj1753--Flip Game(推导)

Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29136   Acc...
  • u013015642
  • u013015642
  • 2014年05月20日 19:37
  • 551
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1753 - Flip Game (位运算 + BFS)
举报原因:
原因补充:

(最多只允许输入30个字)