您的位置:首页 > 其它

poj1753(BFS+位存储)

2014-03-16 09:42 281 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二进制 poj BFS