poj1753 Flip Game
来源:互联网 发布:自己开淘宝店怎么代理 编辑:程序博客网 时间:2024/05/17 17:44
#include<iostream>
using namespace std;
//#define REVERSE(DATA,BIT) DATA^(1<<BIT)
bool v[65535];
int head,tail;
struct point{
int dis;
unsigned short state;
};
point Q[65535];
int bfs();
bool vis(point& t);
unsigned short move(unsigned short state, int i);
int main()
{
int l=bfs();
if(l<0)
cout<<"Impossible"<<endl;
else
cout<<l<<endl;
return 0;
}
bool vis(point& t)
{
if(v[t.state])
return true;
v[t.state]=1;
return false;
}
int bfs()
{
point t,now,ext;
int i=0,j=0,c;
char str[5][5]; //注意,定义长度时要大于4*4,一定要包含结束符,不然提交之后是WA
t.state=0;
memset(v,0,sizeof(v));
for(i=1;i<=4;i++)
{
cin>>str[i-1];
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if(str[i][j]=='b')
c=1;
else
c=0;
t.state|=c<<(i*4+j);
}
t.dis=0;
head=tail=0;
Q[tail++]=t;
// vis(t);
v[t.state]=1;
while(head<tail)
{
now=Q[head++];
if(now.state==0 || now.state==65535)
return now.dis;
int s=now.state;
unsigned short temp=0;
for(i=0;i<16;++i)
{
temp=0;
temp |= (1<<i);
if((i+1)%4!=0)
temp |= (1<<(i+1));
if(i%4 != 0)
temp |= (1<<(i-1));
if(i+4 < 16)
temp |= (1<<(i+4));
if(i-4 >= 0)
temp |= (1<<(i-4));
ext.state=s^temp;
ext.dis=now.dis+1;
if(!vis(ext))
{
Q[tail++]=ext;
}
}
}
return -1;
}
注:本题的技巧在于如何表示所有可能出现得plates状态,一共16个盘子,可以使用16位来表示,即两个字节。本题涉及到对某一位求反,可用函数REVERSE(DATA,BIT) DATA^(1<<BIT)。
- poj1753 Flip Game
- poj1753 Flip Game
- poj1753 Flip Game
- poj1753 flip game题解
- POJ1753 Flip Game
- POJ1753-Flip Game
- poj1753 - Flip Game
- POJ1753 Flip Game
- poj1753 Flip Game
- POJ1753 Flip Game
- poj1753:Flip Game
- POJ1753 Flip Game【DFS】
- poj1753-Flip Game
- poj1753 Flip Game 广搜哈希
- poj1753--Flip Game
- poj1753 Flip Game
- POJ1753:Flip Game
- POJ1753 Flip Game 枚舉
- 特价话费
- 骑士时代已经过去;随之而来的是智者、经济学家和计算机天才的世界。-埃德蒙•伯克
- [转载]网站开发人员应该知道的62件事
- About OpenMP
- Linux的.desktop文件格式及常用属性
- poj1753 Flip Game
- 显示单位px和dip以及sp的区别
- C# 写入二进制文件
- 数据表格单元格合并拆分之算法分析
- 编辑Linux菜单
- .net开发中常用的第三方组件
- 每隔20秒自动绑定事件livequery
- poj1077Eights
- 读写文件流