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;
}
每一个位置的棋子有两种颜色,黑或白,我们可以用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;
}
相关文章推荐
- 设计一个算法,采用BFS方式输出图G中从顶点u到v的最短路径(不带权的无向连通图G采用邻接表存储)
- 第六章:图。(邻接矩阵实现图的存储及dfs、bfs)
- Dungeon Master 和上题基本相同 bfs(),求最优值 不同的是三维bfs(),存储有技巧 (u=x*r*c+y*c+z);
- 第六章:图。(邻接表实现图的存储及dfs、bfs)
- 基于邻接表存储的图的DFS与BFS遍历
- poj1753(位运算压缩状态+bfs)
- 数据结构--图--图的存储结构/DFS/BFS
- POJ1753 状态压缩(+BFS) + 棋盘问题
- 邻接矩阵存储的无向图深度优先(DFS)广度优先(BFS)遍历
- 数据结构之图(邻接表存储,DFS和BFS遍历)
- poj1753 Flip Game 枚举+BFS
- 第六章:图。(邻接表实现图的存储及dfs、bfs)
- POJ1753《Flip Game》方法:BFS+Bit
- 图的邻接表存储及DFS,BFS遍历
- 数据结构(11) -- 邻接表存储图的DFS和BFS
- POJ-1753 Flip Game【枚举+BFS+位存储】
- 第六章:图。(邻接矩阵实现图的存储及dfs、bfs)
- POJ1753 -- BFS和位运算
- BFS和DFS路径存储和打印
- 树的存储结构和图的存储结构以及图的深度优先DFS搜索和BFS广度优先搜索