首页 > 其他 > 详细

poj1753(BFS+位存储)

时间:2014-03-16 11:36:38      阅读:402      评论:0      收藏:0      [点我收藏+]

题目链接:poj1753

每一个位置的棋子有两种颜色,黑或白,我们可以用0,1来表示颜色。一共有16个棋子,可以用一个int型的数来表示这16个棋子的状态。然后BFS搜一下,最多65535次

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = (1<<16)-1;
int v[N+5],state,flag;
int judge(char c)
{
    if(c == ‘b‘)
        return 1;
    else
        return 0;
}
int cal(int state, int pos)
{
    state ^= (1<<pos);//自身取反,变色
    if(pos >= 4)//上
        state ^= (1<<(pos-4));
    if(pos <= 11)//下
        state ^= (1<<(pos+4));
    if(pos%4 != 0)//左
        state ^= (1<<(pos-1));
    if(pos%4 != 3)//右
        state ^= (1<<(pos+1));
    return state;
}
void bfs()
{
    memset(v, -1, sizeof(v));
    v[state] = 0;
    queue <int> q;
    q.push(state);
    while(!q.empty())
    {
        int tmp = q.front();
        q.pop();
        for(int i = 0; i < 16; i ++)//枚举,改变每一枚棋子的颜色
        {
            state = cal(tmp, i);
            if(v[state] != -1) continue;//状态已经出现过
            if(state == 0 || state == N)
            {
                printf("%d\n",v[tmp] + 1);
                flag = 1;
                return;
            }
            v[state] = v[tmp] + 1;
            q.push(state);
        }
    }
}
int main()
{
    int i,j,k = 0;
    char a[10];
    state = 0;
    for(i = 0; i < 4; i++)
    {
        scanf("%s",a);
        for(j = 0; j < 4; j ++, k ++)
        {
            state += (judge(a[j]))<<k;//初始状态
        }
    }
    if(state == 0 || state == N)
    {
        printf("0\n");
        return 0;
    }
    flag = 0;
    bfs();
    if(!flag)
        printf("Impossible\n");
    return 0;
}


poj1753(BFS+位存储),布布扣,bubuko.com

poj1753(BFS+位存储)

原文:http://blog.csdn.net/jzmzy/article/details/21318217

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!