一般地图很小,状态不多,可以装压或者hash,构造压缩或hash的函数,构造还原地图的函数,然后就无脑bfs(感觉就是SPFA)
题目:
1.玩具游戏:二进制压缩状态
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
int s,e;
bool vis[1<<17];
int dis[1<<17],map[5][5];
int dy[4]={0,0,1,-1};
int dx[4]={1,-1,0,0};
inline void div(int x){
for(int i=4;i>=1;--i){
for(int j=4;j>=1;--j){
map[i][j]=x&1;
x>>=1;
}
}
}
inline int zip(){
int x=0;
for(int i=1;i<=4;++i){
for(int j=1;j<=4;++j){
x<<=1;
x|=map[i][j];
}
}
return x;
}
inline void bfs(){
queue<int>q;
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
vis[s]=1;
q.push(s);
while(!q.empty()){
int x=q.front();
q.pop();
vis[x]=0;
div(x);
for(int i=1;i<=4;++i){
for(int j=1;j<=4;++j){
if(map[i][j]!=1)continue;
for(int k=0;k<4;++k){
int xx=dx[k]+i;
int yy=dy[k]+j;
if(xx<1||xx>4||yy<1||yy>4)continue;
if(map[xx][yy])continue;
swap(map[xx][yy],map[i][j]);
int w=zip();
swap(map[xx][yy],map[i][j]);
if(dis[w]>dis[x]+1){
dis[w]=dis[x]+1;
if(!vis[w]){
q.push(w);
vis[w]=1;
}
}
}
}
}
}
}
int main(){
for(int i=1;i<=4;++i){
char t[10];
scanf("%s",t+1);
for(int j=1;j<=4;++j){
s<<=1;
if(t[j]=='1')s|=1;
}
}
for(int i=1;i<=4;++i){
char t[10];
scanf("%s",t+1);
for(int j=1;j<=4;++j){
e<<=1;
if(t[j]=='1')e|=1;
}
}
bfs();
cout<<dis[e]<<endl;
return 0;
}
2.八数码难题:偷懒 map来hash存状态,转移很少9!
#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#include<queue>
using namespace std;
long long s,t;
int tot,dis[402880],m[4][4];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
map<long long ,int >h;
bool v[20],vis[400000];
inline long long poww(long long a,long long b){
long long ans=1;
while(b){
if(b&1)ans*=a;
a*=a;
b>>=1;
}
return ans;
}
inline void dfs(int pos,long long val){
if(pos>9){
h[val]=++tot;
return ;
}
for(int i=0;i<=8;++i){
if(v[i])continue;
v[i]=1;
dfs(pos+1,val+i*poww(10,pos-1));
v[i]=0;
}
}
inline void div(long long x){
for(int i=3;i>=1;--i){
for(int j=3;j>=1;--j){
m[i][j]=x%10;
x/=10;
}
}
}
inline long long zip(){
long long x=0;
for(int i=1;i<=3;++i){
for(int j=1;j<=3;++j){
x*=10;
x+=m[i][j];
}
}
return x+1000000000;
}
inline void bfs(){
queue<long long>q;
memset(dis,0x3f,sizeof(dis));
int ss=h[s];
vis[ss]=1;
dis[ss]=0;
q.push(s);
while(q.size()){
long long x=q.front();
q.pop();
vis[h[x]]=0;
div(x);
for(int i=1;i<=3;++i){
for(int j=1;j<=3;++j){
if(m[i][j])continue;
for(int k=0;k<4;++k){
int xx=dx[k]+i;
int yy=dy[k]+j;
if(xx<1||xx>3||yy<1||yy>3)continue;
if(!m[xx][yy])continue;
swap(m[xx][yy],m[i][j]);
long long temp=zip();
swap(m[xx][yy],m[i][j]);
int u=h[x];
int v=h[temp];
if(dis[v]>dis[u]+1){
dis[v]=dis[u]+1;
if(!vis[v]){
vis[v]=1;
q.push(temp);
}
}
}
}
}
}
}
int main(){
dfs(1,1000000000);
cin>>s;
s+=1000000000;
t=1123804765;
bfs();
cout<<dis[h[t]];
return 0;
}

压状态bfs的更多相关文章

  1. hdu 3247 AC自动+状压dp+bfs处理

    Resource Archiver Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Ot ...

  2. BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS

    BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS Description Farmer John has taken the cows to a va ...

  3. UVA1600 状态BFS

    刚开是我用了一种很笨的bfs过掉的,后来看到原来还可以三维带状态BFS,觉得是一个不错的思路. d[x][y][k]表示坐标位于(x,y)经过K个障碍到达时的最短路径,当然如果(x,y)处的数字是0就 ...

  4. POJ - 2965 The Pilots Brothers' refrigerator(压位+bfs)

    The game “The Pilots Brothers: following the stripy elephant” has a quest where a player needs to op ...

  5. 【状压+状态转移】A Famous Airport Managere

    https://www.bnuoj.com/v3/problem_show.php?pid=25653 [题意] 给定一个3*3的九宫格,模拟一个停机坪.第一个格子一定是'*',代表take off ...

  6. HDU 3681 Prison Break(状压DP + BFS)题解

    题意:一张图,F是起点,Y是必须要到的点,D不能走,G可以充电.可以往四个方向走,每走一步花费一个电,走到G可以选择充满电或者不充,每个G只能充一次.问你走遍Y的最小初始点亮.number(G) + ...

  7. HDU 2209 翻纸牌游戏 状态BFS

    翻纸牌游戏 Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem De ...

  8. 搜索(另类状态BFS):NOIP 华容道

    描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. 小 B 玩的华容道与经典的 ...

  9. poj1753(位运算压缩状态+bfs)

    题意:有个4*4的棋盘,上面摆着黑棋和白旗,b代表黑棋,w代表白棋,现在有一种操作,如果你想要改变某一个棋子的颜色,那么它周围(前后左右)棋子的颜色都会被改变(白变成黑,黑变成白),问你将所有棋子变成 ...

随机推荐

  1. linux中的swap

    1. 也许你会经常遇到一个经典的swap大小设置问题(比如狗血的面试题). 很多人多会说内存的2倍.. 但是个人认为一般而言 swap 不要设置太大,最好不要超过4G. 2. 进程申请内存不足时,发现 ...

  2. [NOIP2013提高组]火柴排队

    题目:洛谷P1966.Vijos P1842.codevs3286. 题目大意:有两排火柴,每根都有一个高度.设a.b分别表示两排火柴的高度,现在要令$\sum(a_i-b_i)^2$最小.现两排火柴 ...

  3. 10 hbase源码系列(十)HLog与日志恢复

    hbase源码系列(十)HLog与日志恢复   HLog概述 hbase在写入数据之前会先写入MemStore,成功了再写入HLog,当MemStore的数据丢失的时候,还可以用HLog的数据来进行恢 ...

  4. ArcGIS Engine获得要素的中心点坐标

    IPoint centerPoint =new PointClass();//获得要素的中心点 IArea pArea = pFeature.Shape as IArea; pArea.QueryCe ...

  5. Android 使用DrawerLayout高速实现側滑菜单

    一.概述 DrawerLayout是一个能够方便的实现Android側滑菜单的组件,我近期开发的项目中也有一个側滑菜单的功能.于是DrawerLayout就派上用场了.假设你从未使用过DrawerLa ...

  6. HackingTeam重磅炸弹: 估值超1000万美金带有军火交易性质的木马病毒以及远控源代码泄露

    [简单介绍] 经常使用网名: 猪头三 出生日期: 1981.XX.XX 个人站点: http://www.x86asm.com QQ交流: 643439947 编程生涯: 2001年~至今[共14年] ...

  7. windows “文件大小”与“占用空间”、文件系统与文件拷贝

    0. 文件大小与占用空间 "文件大小"和"占用空间"的差别 首先需要明确的是,"文件大小"代表着文件的真实大小(文件内容实际包含的全部字节数 ...

  8. HBase的单节点集群详细启动步骤(分为Zookeeper自带还是外装)

    伪分布模式下,如(weekend110)hbase-env.sh配置文档中的HBASE_MANAGES_ZK的默认值是true,它表示HBase使用自身自带的Zookeeper实例.但是,该实例只能为 ...

  9. C/C++(C++类与对象)

    构造器(constructor) 1.与类名相同,无返回,被系统生成对象时自动调用,用于初始化. 2.可以有参数,构造器的重载,有默认参数.重载和默认参数不能同时出现,但是一定要包含标配(无参数的构造 ...

  10. tensorflow学习之路---简单的代码

    import numpyimport tensorflow as tf #自己创建的数据x_data = numpy.random.rand(100).astype(numpy.float32)#创建 ...