hdu5025 状态压缩广搜
题意:
悟空要救唐僧,中途有最多就把钥匙,和最多五条蛇,要求就得唐僧并且拿到所有种类的钥匙(两个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 状态压缩广搜相关推荐
- NYOJ999 师傅又被妖怪抓走了(预处理+状态压缩+广搜BFS)
题目: 师傅又被妖怪抓走了 时间限制: 1000 ms | 内存限制: 65535 KB 难度: 3 描述 话说唐僧复得了孙行者,师徒们一心同体,共诣西方.自宝象国救了公主,承君臣送出城西,沿路饥 ...
- POJ1324贪吃蛇(状态压缩广搜)
题意: 给你一个地图,有的地方能走,有的地方不能走,然后给你一条蛇,问你这条蛇的头部走到1,1的位置的最少步数,注意,和贪吃蛇不太一样,就是蛇咬到自己身体的那个地方,具体怎么不一样自己模拟 ...
- 提高篇 第五部分 动态规划 第4章 状态压缩类动态规划
例1 骑士(Sgu223) 1592:[例 1]国王 信息学奥赛一本通(C++版)在线评测系统 https://blog.csdn.net/guoyangfan_/article/details/82 ...
- POJ2688状态压缩(可以+DFS剪枝)
题意: 给你一个n*m的格子,然后给你一个起点,让你遍历所有的垃圾,就是终点不唯一,问你最小路径是多少? 思路: 水题,方法比较多,最省事的就是直接就一个BFS状态压缩暴搜就行 ...
- 深搜和广搜的原理及优缺点
深搜原理 深搜,顾名思义,是深入其中.直取结果的一种搜索方法. 如果深搜是一个人,那么他的性格一定倔得像头牛!他从一点出发去旅游,只朝着一个方向走,除非路断了,他绝不改变方向!除非四个方向全都不通或遇 ...
- nyist 999 师傅又被妖怪抓走了 【双广搜 || BFS +状态压缩】
题目:nyist 999 师傅又被妖怪抓走了 分析:在一个图中只要看到D点和E点就行的最小步数,看到的定义是:也就是说两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方. 所以可 ...
- 独轮车(广搜状态转移的下一步伐的理解)
Problem D 独轮车 时限:1000ms 内存限制:10000K 总时限:3000ms 描述: 独轮车的轮子上有红.黄.蓝.白.绿(依顺时针序)5种颜色,在一个如下图所示的20*20的迷宫内每走 ...
- poj 3131 Cubic Eight-Puzzle 双向广搜 Hash判重
挺不错的题目,很锻炼代码能力和调试能力~ 题意:初始格子状态固定,给你移动后格子的状态,问最少需要多少步能到达,如果步数大于30,输出-1. 由于单向搜索状态太多,搜到二十几就会爆了,所以应该想到双向 ...
- 双向广搜-HDU1401 Solitaire
文章目录 双向广搜 例题 题意 分析 代码 小结 双向广搜 什么是双向广搜? 如果把bfs想象成在平静的池塘丢一颗石头,激起的波浪一层层扩散到整个空间直到到达目标,就得到起点到终点的最优路径.那么双向 ...
最新文章
- 兵团教师计算机水平考试免考条件,兵团职称计算机考试政策.doc
- mysql 截断多个表,PHPamp; MySQL:截断多个表
- kinux查日志_Linux实时查看日志的四种命令详解
- 【详解,小白也能看懂】javaweb-Servlet中, OutputStream与PrintWriter的使用和区别
- chrome浏览器世界之窗浏览器的收藏夹在哪?
- springmvc的过程及源码初涉
- (转)淘淘商城系列——maven工程debug调试
- jfreechart createBarChart 去掉立体感
- asp.net findcontrol html控件,findcontrol-在ASP.NET中查找控件的更好方法
- node python 后台启动_NodeJS后台
- SecureCRT for Mac(强大的终端SSH工具)
- [转]	 制作PPT的全过程,存着有用
- python pywifi 破解wifi密码
- 大数据架构与技术——(一)大数据概述
- 写论文同义替换的软件.v.1.2.3
- 从人工智能到物联网……这些公司如何改变农业与食品工业
- 华为m3现在还能用吗_现在买二手华为平板m3还能用吗?
- 固态硬盘之主控哪家强?
- docker更换镜像源
- 什么是外汇套期保值?套期保值和对冲有什么区别?