https://loj.ac/problem/6121

BFS + 状压

写过就好想,注意细节debug

  1. #include <bits/stdc++.h>
  2. #define read read()
  3. #define up(i,l,r) for(register int i = (l);i <= (r);i++)
  4. #define down(i,l,r) for(register int i = (l);i >= (r);i--)
  5. #define traversal_vedge(i) for(register int i = head[u]; i ;i = e[i].nxt)
  6. #define ll long long
  7. using namespace std;
  8. int read
  9. {
  10. int x = , f = ; char ch = getchar();
  11. while(ch < || ch > ) {if(ch == '-')f = -; ch = getchar();}
  12. while(ch >= && ch <=) {x = * x + ch - ;ch = getchar();}
  13. return x * f;
  14. }
  15. void write(int x)
  16. {
  17. if(x < ) x = -x,putchar('-');
  18. if(x > ) write(x/);
  19. putchar(x% + );
  20. }
  21. //-----------------------------------------------------------------
  22. const int N = ;
  23. int n,m,p,k,s;
  24. int maps[N][N][N][N],cnt[N][N],type[N][N][N],vis[N][N][(<<N)];
  25. int dx[] = {,,,-,},dy[] = {,-,,,};
  26.  
  27. void readdata()
  28. {
  29. n = read; m = read; p = read; k = read;
  30. int x1,x2,y1,y2,G;
  31. while(k--)
  32. {
  33. x1 = read; y1 = read; x2 = read; y2 = read; G = read;
  34. if(G) maps[x1][y1][x2][y2] = maps[x2][y2][x1][y1] = G;
  35. else maps[x1][y1][x2][y2] = maps[x2][y2][x1][y1] = -;
  36. }
  37. s = read; int q;
  38. while(s--)
  39. {
  40. x1 = read; x2 = read; q = read;
  41. type[x1][x2][++cnt[x1][x2]] = q;
  42. }
  43. }
  44.  
  45. struct node{
  46. int x,y,step,state;
  47. };
  48.  
  49. int get_state(int x,int y)
  50. {
  51. int ans = ;
  52. up(i,,cnt[x][y]) ans |= (<<(type[x][y][i] - ));
  53. return ans;
  54. }
  55.  
  56. int bfs()
  57. {
  58. queue <node> q;
  59. int s = get_state(,);
  60. q.push((node){,,,s} );
  61. vis[][][s] = ;
  62. while(!q.empty())
  63. {
  64. node u = q.front(); q.pop();
  65. int x = u.x,y = u.y;
  66. if(x == n && y == m) return u.step;
  67. up(i,,)
  68. {
  69. int nx = x + dx[i],ny = y + dy[i];
  70. if(nx < || ny < || nx > n || ny > m) continue;
  71. int obstacle = maps[x][y][nx][ny];
  72. if(obstacle == -) continue;
  73. if( obstacle > && (u.state & <<(obstacle - )) == ) continue;//debug obstacle - 1 <- 1 - obstacle
  74. int ns = u.state|get_state(nx,ny);//degug u.state <- s;
  75. if(vis[nx][ny][ns]) continue;
  76. vis[nx][ny][ns] = ;
  77. q.push( (node){nx,ny,u.step+,ns} );
  78. }
  79. }
  80. return -;
  81. }
  82.  
  83. int main()
  84. {
  85. freopen("input.txt","r",stdin);
  86. readdata();
  87. printf("%d\n",bfs());
  88. return ;
  89. }

孤岛营救问题 (BFS+状压)的更多相关文章

  1. 孤岛营救问题(BFS+状压DP)

    孤岛营救问题 https://www.luogu.org/problemnew/show/P4011 用状压DP标记拿到钥匙的数量 #include<iostream> #include& ...

  2. 洛谷P4011 孤岛营救问题(状压+BFS)

    传送门 和网络流有半毛钱关系么…… 可以发现$n,m,p$都特别小,那么考虑状压,每一个状态表示位置以及钥匙的拥有情况,然后每次因为只能走一步,所以可以用bfs求出最优解 然后是某大佬说的注意点:每个 ...

  3. 【洛谷4011】孤岛营救问题(状压SPFA)

    点此看题面 大致题意: 有一个\(N*M\)的四联通迷宫,相邻两个可能互通,可能有一扇门,也可能有一堵墙.对于第\(i\)类的门,你需要有第\(i\)类的钥匙才可以通过.问你从\((1,1)\)到达\ ...

  4. hdu 5094 Maze (BFS+状压)

    题意: n*m的迷宫.多多要从(1,1)到达(n,m).每移动一步消耗1秒.有P种钥匙. 有K个门或墙.给出K个信息:x1,y1,x2,y2,gi    含义是(x1,y1)与(x2,y2)之间有gi ...

  5. hdu 4771 Stealing Harry Potter's Precious (BFS+状压)

    题意: n*m的迷宫,有一些格能走("."),有一些格不能走("#").起始点为"@". 有K个物体.(K<=4),每个物体都是放在& ...

  6. 【BZOJ 3049】【USACO2013 Jan】Island Travels BFS+状压DP

    这是今天下午的互测题,只得了60多分 分析一下错因: $dis[i][j]$只记录了相邻的两个岛屿之间的距离,我一开始以为可以,后来$charge$提醒我有可能会出现来回走的情况,而状压转移就一次,无 ...

  7. HDU 5025:Saving Tang Monk(BFS + 状压)

    http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Problem Description   <Journey to ...

  8. hdu 4856 Tunnels (bfs + 状压dp)

    题目链接 The input contains mutiple testcases. Please process till EOF.For each testcase, the first line ...

  9. 【HDU 4771 Stealing Harry Potter's Precious】BFS+状压

    2013杭州区域赛现场赛二水... 类似“胜利大逃亡”的搜索问题,有若干个宝藏分布在不同位置,问从起点遍历过所有k个宝藏的最短时间. 思路就是,从起点出发,搜索到最近的一个宝藏,然后以这个位置为起点, ...

随机推荐

  1. Spring系列博客汇总

    https://www.cnblogs.com/leeSmall/category/1093236.html   springmvc https://www.cnblogs.com/leeSmall/ ...

  2. SpringBoot入门篇--关于properties和yml两种配置文件的一些事情

    我们在使用SpringBoot这个框架的时候都一定使用或者说是见到过application.properties或者是application.yml,经不住有人就会问这俩文件到底是什么情况,其实说白了 ...

  3. Android 开发 框架系列 Android-Universal-Image-Loader 图片加载使用demo

    Android-Universal-Image-Loader github地址:https://github.com/nostra13/Android-Universal-Image-Loader 加 ...

  4. profile default

    SAPDBHOST = 10.199.0.26 j2ee/dbtype = hdb j2ee/dbname = ISD j2ee/dbhost = 10.199.0.26 dbs/hdb/dbname ...

  5. python数据分析库pandas

    在我看来,对于Numpy以及Matplotlib,Pandas可以帮助创建一个非常牢固的用于数据挖掘与分析的基础.而Scipy(会在接下来的帖子中提及)当然是另一个主要的也十分出色的科学计算库,但是我 ...

  6. ViewModel学习

    ViewModel是一个负责准备和管理Activity或Fragment数据的类.它还处理Activity / Fragment与应用程序其余部分的通信(例如,调用业务逻辑类). 始终与范围(Frag ...

  7. .NET Entity Framework基本使用方法

    生成模型 EF有两种查询方式,Linq查询 .Lambda表达式 //普通查询 Linq 方式 IQueryable<Book> list = from b in db.Set<Bo ...

  8. 析构方法(__del__)

    析构方法,当对象在内存中被释放时(也就是实例执行完了,实例的内存就会自动释放,这时候就会触发),自动触发执行. 当程序结束时,python只会回收自己的内存空间,即用户态内存,而操作系统的资源则没有被 ...

  9. Django之如何预防csrf功能的方式 form提交与ajax提交

    1. 什么是csrf认证: 主要是防止别人恶意登录你的账户信息用的: 2. csrf认证在django的实现方式: 分为两种, 一种是from表单提交的方式,另一种是ajax提交实现方式 前端: &l ...

  10. python的相对导入

    最近断断续续学习flask,学到蓝本时候有点小问题卡住了,问题如下 导入包的时候py文件里使用了相对路径导入,但是这种导入方法不是很明白,就自己搜索加实验了终于有点眉目了 先定义一个包 adb包 这个 ...