孤岛营救问题 (BFS+状压)
BFS + 状压
写过就好想,注意细节debug
- #include <bits/stdc++.h>
- #define read read()
- #define up(i,l,r) for(register int i = (l);i <= (r);i++)
- #define down(i,l,r) for(register int i = (l);i >= (r);i--)
- #define traversal_vedge(i) for(register int i = head[u]; i ;i = e[i].nxt)
- #define ll long long
- using namespace std;
- int read
- {
- int x = , f = ; char ch = getchar();
- while(ch < || ch > ) {if(ch == '-')f = -; ch = getchar();}
- while(ch >= && ch <=) {x = * x + ch - ;ch = getchar();}
- return x * f;
- }
- void write(int x)
- {
- if(x < ) x = -x,putchar('-');
- if(x > ) write(x/);
- putchar(x% + );
- }
- //-----------------------------------------------------------------
- const int N = ;
- int n,m,p,k,s;
- int maps[N][N][N][N],cnt[N][N],type[N][N][N],vis[N][N][(<<N)];
- int dx[] = {,,,-,},dy[] = {,-,,,};
- void readdata()
- {
- n = read; m = read; p = read; k = read;
- int x1,x2,y1,y2,G;
- while(k--)
- {
- x1 = read; y1 = read; x2 = read; y2 = read; G = read;
- if(G) maps[x1][y1][x2][y2] = maps[x2][y2][x1][y1] = G;
- else maps[x1][y1][x2][y2] = maps[x2][y2][x1][y1] = -;
- }
- s = read; int q;
- while(s--)
- {
- x1 = read; x2 = read; q = read;
- type[x1][x2][++cnt[x1][x2]] = q;
- }
- }
- struct node{
- int x,y,step,state;
- };
- int get_state(int x,int y)
- {
- int ans = ;
- up(i,,cnt[x][y]) ans |= (<<(type[x][y][i] - ));
- return ans;
- }
- int bfs()
- {
- queue <node> q;
- int s = get_state(,);
- q.push((node){,,,s} );
- vis[][][s] = ;
- while(!q.empty())
- {
- node u = q.front(); q.pop();
- int x = u.x,y = u.y;
- if(x == n && y == m) return u.step;
- up(i,,)
- {
- int nx = x + dx[i],ny = y + dy[i];
- if(nx < || ny < || nx > n || ny > m) continue;
- int obstacle = maps[x][y][nx][ny];
- if(obstacle == -) continue;
- if( obstacle > && (u.state & <<(obstacle - )) == ) continue;//debug obstacle - 1 <- 1 - obstacle
- int ns = u.state|get_state(nx,ny);//degug u.state <- s;
- if(vis[nx][ny][ns]) continue;
- vis[nx][ny][ns] = ;
- q.push( (node){nx,ny,u.step+,ns} );
- }
- }
- return -;
- }
- int main()
- {
- freopen("input.txt","r",stdin);
- readdata();
- printf("%d\n",bfs());
- return ;
- }
孤岛营救问题 (BFS+状压)的更多相关文章
- 孤岛营救问题(BFS+状压DP)
孤岛营救问题 https://www.luogu.org/problemnew/show/P4011 用状压DP标记拿到钥匙的数量 #include<iostream> #include& ...
- 洛谷P4011 孤岛营救问题(状压+BFS)
传送门 和网络流有半毛钱关系么…… 可以发现$n,m,p$都特别小,那么考虑状压,每一个状态表示位置以及钥匙的拥有情况,然后每次因为只能走一步,所以可以用bfs求出最优解 然后是某大佬说的注意点:每个 ...
- 【洛谷4011】孤岛营救问题(状压SPFA)
点此看题面 大致题意: 有一个\(N*M\)的四联通迷宫,相邻两个可能互通,可能有一扇门,也可能有一堵墙.对于第\(i\)类的门,你需要有第\(i\)类的钥匙才可以通过.问你从\((1,1)\)到达\ ...
- hdu 5094 Maze (BFS+状压)
题意: n*m的迷宫.多多要从(1,1)到达(n,m).每移动一步消耗1秒.有P种钥匙. 有K个门或墙.给出K个信息:x1,y1,x2,y2,gi 含义是(x1,y1)与(x2,y2)之间有gi ...
- hdu 4771 Stealing Harry Potter's Precious (BFS+状压)
题意: n*m的迷宫,有一些格能走("."),有一些格不能走("#").起始点为"@". 有K个物体.(K<=4),每个物体都是放在& ...
- 【BZOJ 3049】【USACO2013 Jan】Island Travels BFS+状压DP
这是今天下午的互测题,只得了60多分 分析一下错因: $dis[i][j]$只记录了相邻的两个岛屿之间的距离,我一开始以为可以,后来$charge$提醒我有可能会出现来回走的情况,而状压转移就一次,无 ...
- HDU 5025:Saving Tang Monk(BFS + 状压)
http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Problem Description <Journey to ...
- hdu 4856 Tunnels (bfs + 状压dp)
题目链接 The input contains mutiple testcases. Please process till EOF.For each testcase, the first line ...
- 【HDU 4771 Stealing Harry Potter's Precious】BFS+状压
2013杭州区域赛现场赛二水... 类似“胜利大逃亡”的搜索问题,有若干个宝藏分布在不同位置,问从起点遍历过所有k个宝藏的最短时间. 思路就是,从起点出发,搜索到最近的一个宝藏,然后以这个位置为起点, ...
随机推荐
- Spring系列博客汇总
https://www.cnblogs.com/leeSmall/category/1093236.html springmvc https://www.cnblogs.com/leeSmall/ ...
- SpringBoot入门篇--关于properties和yml两种配置文件的一些事情
我们在使用SpringBoot这个框架的时候都一定使用或者说是见到过application.properties或者是application.yml,经不住有人就会问这俩文件到底是什么情况,其实说白了 ...
- Android 开发 框架系列 Android-Universal-Image-Loader 图片加载使用demo
Android-Universal-Image-Loader github地址:https://github.com/nostra13/Android-Universal-Image-Loader 加 ...
- profile default
SAPDBHOST = 10.199.0.26 j2ee/dbtype = hdb j2ee/dbname = ISD j2ee/dbhost = 10.199.0.26 dbs/hdb/dbname ...
- python数据分析库pandas
在我看来,对于Numpy以及Matplotlib,Pandas可以帮助创建一个非常牢固的用于数据挖掘与分析的基础.而Scipy(会在接下来的帖子中提及)当然是另一个主要的也十分出色的科学计算库,但是我 ...
- ViewModel学习
ViewModel是一个负责准备和管理Activity或Fragment数据的类.它还处理Activity / Fragment与应用程序其余部分的通信(例如,调用业务逻辑类). 始终与范围(Frag ...
- .NET Entity Framework基本使用方法
生成模型 EF有两种查询方式,Linq查询 .Lambda表达式 //普通查询 Linq 方式 IQueryable<Book> list = from b in db.Set<Bo ...
- 析构方法(__del__)
析构方法,当对象在内存中被释放时(也就是实例执行完了,实例的内存就会自动释放,这时候就会触发),自动触发执行. 当程序结束时,python只会回收自己的内存空间,即用户态内存,而操作系统的资源则没有被 ...
- Django之如何预防csrf功能的方式 form提交与ajax提交
1. 什么是csrf认证: 主要是防止别人恶意登录你的账户信息用的: 2. csrf认证在django的实现方式: 分为两种, 一种是from表单提交的方式,另一种是ajax提交实现方式 前端: &l ...
- python的相对导入
最近断断续续学习flask,学到蓝本时候有点小问题卡住了,问题如下 导入包的时候py文件里使用了相对路径导入,但是这种导入方法不是很明白,就自己搜索加实验了终于有点眉目了 先定义一个包 adb包 这个 ...