poj1753(BFS+位存储)

本文介绍了如何使用广度优先搜索(BFS)解决POJ1753问题,该问题是关于通过改变棋盘上棋子的颜色(黑色或白色)来实现特定状态变化的算法问题。文章详细解释了状态表示、颜色判断函数、状态转换函数以及BFS算法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值