题意:

     给你一个n*m的地图,问你从起点出发,吧所有的宝藏都捡完用的最少时间。

思路:k <= 4,水题,直接开一个数组mark[now][x][y];now代表的是当前检宝藏的二进制压缩状态,然后就直接搜索就行了。


  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<queue>
  4.  
  5. #define N 100 + 5

  6. using namespace std;
  7. typedef struct
  8. {
  9. int x ,y ,now;
  10. }NODE;
  11.  
  12. NODE xin ,tou;
  13. int mark[1<<4][N][N];
  14. int map[N][N];
  15. int dir[4][2] = {0 ,1 ,0 ,-1 ,1 ,0 ,-1 ,0};
  16. NODE K[5];
  17. int n ,m ,k;
  18. bool ok(int x ,int y ,int now)
  19. {
  20. return x <= n && x >= 1 && y <= m && y >= 1 && !mark[now][x][y] && map[x][y];
  21. }
  22. int BFS(int sx ,int sy)
  23. {
  24. queue<NODE>q;
  25. xin.x = sx ,xin.y = sy ,xin.now = 0;
  26. int mk = 0;
  27. for(int i = 1 ;i <= k ;i ++)
  28. if(xin.x == K[i].x && xin.y == K[i].y)
  29. {
  30. mk = i;
  31. break;
  32. }
  33. if(mk) xin.now = 0 | (1 << (mk - 1));
  34. memset(mark ,0 ,sizeof(mark));
  35. q.push(xin);
  36. mark[xin.now][xin.x][xin.y] = 1;
  37. while(!q.empty())
  38. {
  39. tou = q.front();
  40. q.pop();
  41. if(tou.now == (1<<k) - 1)
  42. return mark[tou.now][tou.x][tou.y] - 1;
  43. for(int i = 0 ;i < 4 ;i ++)
  44. {
  45. xin.x = tou.x + dir[i][0];
  46. xin.y = tou.y + dir[i][1];
  47. xin.now = tou.now;
  48. int mk = 0;
  49. for(int j = 1 ;j <= k ;j ++)
  50. if(xin.x == K[j].x && xin.y == K[j].y)
  51. {
  52. mk = j;
  53. break;
  54. }
  55. if(mk) xin.now = tou.now | (1<<(mk - 1));
  56. if(ok(xin.x ,xin.y ,xin.now))
  57. {
  58. mark[xin.now][xin.x][xin.y] = mark[tou.now][tou.x][tou.y] + 1;
  59. q.push(xin);
  60. }
  61. }
  62. }
  63. return -1;
  64. }
  65. int main ()
  66. {
  67. int i ,j ,sx ,sy;
  68. char str[N];
  69. while(~scanf("%d %d" ,&n ,&m) && n + m)
  70. {
  71. for(i = 1 ;i <= n ;i ++)
  72. {
  73. scanf("%s" ,str);
  74. for(j = 1 ;j <= m ;j ++)
  75. {
  76. if(str[j-1] == '@')
  77. map[i][j] = 1 ,sx = i ,sy = j;
  78. if(str[j-1] == '.') map[i][j] = 1;
  79. if(str[j-1] == '#') map[i][j] = 0;
  80. }
  81. }
  82. scanf("%d" ,&k);
  83. for(i = 1 ;i <= k ;i ++)
  84. scanf("%d %d" ,&K[i].x ,&K[i].y);
  85. printf("%d\n" ,BFS(sx ,sy));
  86. }
  87. return 0;
  88. }

hdu4771 水搜索(状态压缩+bfs)的更多相关文章

  1. POJ 2046 Gap 搜索- 状态压缩

    题目地址: http://poj.org/problem?id=2046 一道搜索状态压缩的题目,关键是怎样hash. AC代码: #include <iostream> #include ...

  2. 胜利大逃亡(续)(状态压缩bfs)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  3. 【HDU - 1429】胜利大逃亡(续) (高级搜索)【状态压缩+BFS】

    Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开 ...

  4. hdu4845 状态压缩BFS

    题意:      给一个n*m的矩阵,从11,走到nm,格子和格子之间可能有墙,也可能有门,有的格子上面有钥匙,相应的钥匙开相应的们,捡钥匙和开门都不需要时间,问你最少多少部能走到nm. 思路:   ...

  5. hdu 3681 Prison Break(状态压缩+bfs)

    Problem Description Rompire . Now it’s time to escape, but Micheal# needs an optimal plan and he con ...

  6. POJ 1753 Flip Game (状态压缩 bfs+位运算)

    Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...

  7. HDU 5025 Saving Tang Monk 【状态压缩BFS】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Time Limit: 2000/1000 MS (Java/O ...

  8. POJ - 1324 Holedox Moving (状态压缩+BFS/A*)

    题目链接 有一个n*m(1<=n,m<=20)的网格图,图中有k堵墙和有一条长度为L(L<=8)的蛇,蛇在移动的过程中不能碰到自己的身体.求蛇移动到点(1,1)所需的最小步数. 显然 ...

  9. POJ 3411 Paid Roads (状态压缩+BFS)

    题意:有n座城市和m(1<=n,m<=10)条路.现在要从城市1到城市n.有些路是要收费的,从a城市到b城市,如果之前到过c城市,那么只要付P的钱, 如果没有去过就付R的钱.求的是最少要花 ...

  10. 「hdu 4845 」拯救大兵瑞恩 [CTSC 1999](状态压缩bfs & 分层图思想)

    首先关于分层图思想详见2004的这个论文 https://wenku.baidu.com/view/dc57f205cc175527072208ad.html 这道题可以用状态压缩,我们对于每一把钥匙 ...

随机推荐

  1. kubernets资源预留

    一.  Kubelet Node Allocatable Kubelet Node Allocatable用来为Kube组件和System进程预留资源,从而保证当节点出现满负荷时也能保证Kube和Sy ...

  2. CSV 注入实战

    oxo1 前言 之前看到过 CSV 注入的文章,具体想了解的请搜索学习,这里不多作介绍.今天刚好碰到了导出功能,就随手测试一波,没想到还真的存在 CSV 注入漏洞. oxo2 经过 1.测试漏洞 看到 ...

  3. FreeBSD 如何安装软件

    1:概括FreeBSD捆绑了丰富的系统工具集合作为基础系统的一部分.此外,FreeBSD提供了两种用于安装第三方软件的补充技术:FreeBSD Ports Collection,用于从源代码安装,以及 ...

  4. The Red Button

    The Red Button 问题 问题描述 Piegirl终于发现了红色按钮,你现在还剩最后一个机会去改变这个结局.这个按钮下面的电路由n个从0到n-1编号节点组成.为了关闭这个按钮,这n个节点必须 ...

  5. python爬取考研专业信息

    伴随着2021考研成绩的公布,2021考研国家线也即将到来.大家是否有过考研的想法了?如果想考研我们就需要了解很多的信息,但是百度的上有太多信息需要我们去一一的鉴别,是比较浪费时间的.所以我们可以学习 ...

  6. Poj3660(floyd)

    题目传送门 题意:编号为1-N的奶牛参加比赛,告诉我们m场比赛结果试问有几头奶牛的排名可以确定. 题解:其实就是一个传递闭包的模板题,用Floyd把所有有联系的比赛结果串在一起. Ac 代码: #in ...

  7. windows使用vscode设置免密登录linux服务器

    秘钥原理解释 id_rsa.pub是公钥,部署在服务器上 id_rsa是私钥,放在windows本地 本质上它们都是个文本文件 操作流程 生成秘钥对(windows和linux均可) ssh-keyg ...

  8. linux screen的用法

    今天使用vps时,起了一个http服务,因为需要用nc接收流量,就要关闭http服务,再去用nc接收流量就接收不到,请教了师傅,这里需要用到screen创建一个会话,就能http服务跟nc同时进行. ...

  9. go中semaphore(信号量)源码解读

    运行时信号量机制 semaphore 前言 作用是什么 几个主要的方法 如何实现 sudog 缓存 acquireSudog releaseSudog semaphore poll_runtime_S ...

  10. Linux 服务器性能测试报告-sysbench命令实践

    Linux 服务器性能测试报告 我们使用linux 工具sysbench 来测试linux服务器性能,目前在Centos上进行操作 Install sysbench yum -y install sy ...