题意:
      悟空要救唐僧,中途有最多就把钥匙,和最多五条蛇,要求就得唐僧并且拿到所有种类的钥匙(两个1只拿一个就行),拿钥匙i之前必须拿到钥匙i-1,打蛇多花费一秒,问救出唐僧并且拿到所有种类的钥匙的最小花费时间。

思路:

      应该两种方法吧,感觉很多都是用4维的标记,然后广搜的,我用的是3维的标记,然后优先队列广搜的,题目没啥难的,关键是读懂题,敲代码的时候细心点就行了。mark[x][y][key] 表示在x,y点是要是状态是key是否走过。


#include<stdio.h>
#include<string.h>
#include<queue>#define N 110

using namespace std;typedef struct NODE
{int x ,y ,key ,t;int she;friend bool operator < (NODE a ,NODE b){return a.t > b.t;}
}NODE;NODE xin ,tou;
int mark[N][N][1<<10];
int  Map[N][N];
int dir[4][2] = {0 ,1 ,0 ,-1 ,1 ,0 ,-1 ,0};
int ex ,ey ,n ,M;int BFS(int x ,int y)
{priority_queue<NODE>q;xin.x = x ,xin.y = y ,xin.t = 0 ,xin.key = 0 ,xin.she = 0;memset(mark ,0 ,sizeof(mark));mark[xin.x][xin.y][xin.key] = 1;q.push(xin);while(!q.empty()){tou = q.top();q.pop();if(tou.x == ex && tou.y == ey && tou.key == (1 << M) - 1){return tou.t;}for(int i = 0 ;i < 4 ;i ++){xin.x = tou.x + dir[i][0];xin.y = tou.y + dir[i][1];xin.t = tou.t + 1;if(xin.x < 1 || xin.x > n || xin.y < 1 || xin.y > n || !Map[xin.x][xin.y])continue;if(Map[xin.x][xin.y] >= 11) {if(tou.she & (1 << (Map[xin.x][xin.y] - 1)))xin.she = tou.she;else {xin.she = tou.she | (1 << (Map[xin.x][xin.y] - 1));                 xin.t ++;}}else xin.she = tou.she;if(Map[xin.x][xin.y] >= 1 && Map[xin.x][xin.y] <= 9){if(Map[xin.x][xin.y] != 1 && !(tou.key & (1 << (Map[xin.x][xin.y] - 2))))xin.key = tou.key;elsexin.key = tou.key | (1 << (Map[xin.x][xin.y] - 1));}else xin.key = tou.key;if(!mark[xin.x][xin.y][xin.key]){mark[xin.x][xin.y][xin.key] = 1;q.push(xin);}}}return -1;
}int main ()
{int i ,j ,x ,y;char str[N];while(~scanf("%d %d" ,&n ,&M) && n + M){int ss = 0;for(i = 1 ;i <= n ;i ++){scanf("%s" ,str);for(j = 0 ;j < n ;j ++){if(str[j] == 'K'){x = i ,y = j + 1;Map[x][y] = 10;}if(str[j] == 'T'){ex = i ,ey = j + 1;Map[ex][ey] = 10;}if(str[j] == '.') Map[i][j+1] = 10;if(str[j] == '#')Map[i][j+1] = 0;if(str[j] >= '1' && str[j] <= '9')Map[i][j+1] = str[j] - '0';if(str[j] == 'S'){ss++;Map[i][j+1] = 10 + ss;}}}int Ans = BFS(x ,y);if(Ans == -1) puts("impossible");else printf("%d\n" ,Ans);}return 0;
}





hdu5025 状态压缩广搜相关推荐

  1. NYOJ999 师傅又被妖怪抓走了(预处理+状态压缩+广搜BFS)

    题目: 师傅又被妖怪抓走了 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 3 描述 话说唐僧复得了孙行者,师徒们一心同体,共诣西方.自宝象国救了公主,承君臣送出城西,沿路饥 ...

  2. POJ1324贪吃蛇(状态压缩广搜)

    题意:       给你一个地图,有的地方能走,有的地方不能走,然后给你一条蛇,问你这条蛇的头部走到1,1的位置的最少步数,注意,和贪吃蛇不太一样,就是蛇咬到自己身体的那个地方,具体怎么不一样自己模拟 ...

  3. 提高篇 第五部分 动态规划 第4章 状态压缩类动态规划

    例1 骑士(Sgu223) 1592:[例 1]国王 信息学奥赛一本通(C++版)在线评测系统 https://blog.csdn.net/guoyangfan_/article/details/82 ...

  4. POJ2688状态压缩(可以+DFS剪枝)

    题意:       给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路:       水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...

  5. 深搜和广搜的原理及优缺点

    深搜原理 深搜,顾名思义,是深入其中.直取结果的一种搜索方法. 如果深搜是一个人,那么他的性格一定倔得像头牛!他从一点出发去旅游,只朝着一个方向走,除非路断了,他绝不改变方向!除非四个方向全都不通或遇 ...

  6. nyist 999 师傅又被妖怪抓走了 【双广搜 || BFS +状态压缩】

    题目:nyist 999 师傅又被妖怪抓走了 分析:在一个图中只要看到D点和E点就行的最小步数,看到的定义是:也就是说两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方. 所以可 ...

  7. 独轮车(广搜状态转移的下一步伐的理解)

    Problem D 独轮车 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 独轮车的轮子上有红.黄.蓝.白.绿(依顺时针序)5种颜色,在一个如下图所示的20*20的迷宫内每走 ...

  8. poj 3131 Cubic Eight-Puzzle 双向广搜 Hash判重

    挺不错的题目,很锻炼代码能力和调试能力~ 题意:初始格子状态固定,给你移动后格子的状态,问最少需要多少步能到达,如果步数大于30,输出-1. 由于单向搜索状态太多,搜到二十几就会爆了,所以应该想到双向 ...

  9. 双向广搜-HDU1401 Solitaire

    文章目录 双向广搜 例题 题意 分析 代码 小结 双向广搜 什么是双向广搜? 如果把bfs想象成在平静的池塘丢一颗石头,激起的波浪一层层扩散到整个空间直到到达目标,就得到起点到终点的最优路径.那么双向 ...

最新文章

  1. 兵团教师计算机水平考试免考条件,兵团职称计算机考试政策.doc
  2. mysql 截断多个表,PHPamp; MySQL:截断多个表
  3. kinux查日志_Linux实时查看日志的四种命令详解
  4. 【详解,小白也能看懂】javaweb-Servlet中, OutputStream与PrintWriter的使用和区别
  5. chrome浏览器世界之窗浏览器的收藏夹在哪?
  6. springmvc的过程及源码初涉
  7. (转)淘淘商城系列——maven工程debug调试
  8. jfreechart createBarChart 去掉立体感
  9. asp.net findcontrol html控件,findcontrol-在ASP.NET中查找控件的更好方法
  10. node python 后台启动_NodeJS后台
  11. SecureCRT for Mac(强大的终端SSH工具)
  12. [转] 制作PPT的全过程,存着有用
  13. python pywifi 破解wifi密码
  14. 大数据架构与技术——(一)大数据概述
  15. 写论文同义替换的软件.v.1.2.3
  16. 从人工智能到物联网……这些公司如何改变农业与食品工业
  17. 华为m3现在还能用吗_现在买二手华为平板m3还能用吗?
  18. 固态硬盘之主控哪家强?
  19. docker更换镜像源
  20. 什么是外汇套期保值?套期保值和对冲有什么区别?

热门文章

  1. Java Web技术经验总结(二)
  2. GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9
  3. python paramiko 问题总结
  4. 广东省广播电视网络股份有限公司佛山分公司BOSS系统容灾中心建设项目
  5. legend3---lavarel安装debugbar工具条
  6. Codeforces 920D Tanks (看题解)
  7. hdu6165(拓扑排序+tarjan缩点)
  8. linux下查看当前用户的 三个命令
  9. 基于linux和php的稳定的分布式数据采集架构
  10. Python学习(四)数据结构 —— set frozenset