HDU-5025 Saving Tang Monk 广度搜索 状态压缩
题目链接:https://cn.vjudge.net/problem/HDU-5025
题意
救唐僧,路上有m(<=9)把钥匙,最多5条蛇和一个唐僧。
目标是前往唐僧的地方,用全部钥匙打开全部的锁,来就唐僧。
钥匙必须要按顺序拿,只有拿过第三个钥匙才可以拿第四个钥匙。
蛇必须得打一个单位时间,打过的蛇就不要再打了。
问最少多长时间可以救出唐僧?没的救输出-1。
思路
又是状压搜索,注意细节即可。
二进制存打过的蛇的集合,注意有可能step大的在队前,所以咱得用优先队列。
如果用普通队列,还得注意vis数组的问题,有可能较大的元素在相同状态上打下标记,
这里就像队列dijkstra一样操作即可,改为int类型记录step。
提交过程
| MLE | 数组大小写错了,注意<<的低优先级 | 
| WA | 注意打过的蛇就不要再打了,被打怕了好么 | 
代码
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=100+2, dir[4][2]={1,0, 0,1, -1,0, 0,-1}, INF=0x3f3f3f3f;
struct State{
	int x, y, step;
	char keys, snake;
	State(int x=0, int y=0, int step=0, char keys=0, char snake=0):
		x(x), y(y), step(step), snake(snake), keys(keys) {}
	bool operator < (const State &a) const{
		return step>a.step;
	}
};
bool vis[maxn][maxn][10+2][(1<<5)+1]; // attend this!!!!!
char map[maxn][maxn];
int n, m;
int bfs(int sx, int sy){
	priority_queue<State> que;
	que.push(State(sx, sy, 0, 0, 0));
	vis[sy][sx][0][0]=true;
	while (que.size()){
		State st=que.top(); que.pop();
		for (int i=0; i<4; i++){
			int xx=st.x+dir[i][0], yy=st.y+dir[i][1];
			char snake=st.snake, keys=st.keys;
			int step=st.step+1;
			if (xx<0 || yy<0 || xx>=n || yy>=n) continue;
			if (map[yy][xx]=='#') continue;
			else if (map[yy][xx]<0){
				int sid=(map[yy][xx]*-1)-1;
				if (!(snake & (1<<sid))) step++;
				snake|=(1<<sid);
			}else if (map[yy][xx]<='9' && map[yy][xx]>='1'){
				int kid=map[yy][xx]-'1';
				if (keys==kid) keys++;
			}else if (map[yy][xx]=='T'){
				if (keys==m) return step;
			}
			if (vis[yy][xx][keys][snake]) continue;
			vis[yy][xx][keys][snake]=true;
			que.push(State(xx, yy, step, keys, snake));
		}
	}
	return -1;
}
int main(void){
	while (scanf("%d%d", &n, &m)==2 && n){
		int sx, sy, sid=-1;
		for (int y=0; y<n; y++){
			scanf("%s", map[y]);
			for (int x=0; x<n; x++)
				if (map[y][x]=='K') sx=x, sy=y, map[y][x]='.';
				else if (map[y][x]=='S') map[y][x]=sid--;
		}
		memset(vis, false, sizeof(vis));
		int ans=bfs(sx, sy);
		if (ans<0) printf("impossible\n");
		else printf("%d\n", ans);
	}
	return 0;
}
| Time | Memory | Length | Lang | Submitted | 
|---|---|---|---|---|
| 468ms | 5856kB | 1700 | C++ | 2018-08-15 00:27:41 | 
HDU-5025 Saving Tang Monk 广度搜索 状态压缩的更多相关文章
- hdu 5025 Saving Tang Monk(bfs+状态压缩)
		Description <Journey to the West>(also <Monkey>) is one of the Four Great Classical Nove ... 
- hdu 5025 Saving Tang Monk 状态压缩dp+广搜
		作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ... 
- 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 ... 
- [ACM] HDU 5025 Saving Tang Monk (状态压缩,BFS)
		Saving Tang Monk Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ... 
- ACM学习历程—HDU 5025 Saving Tang Monk(广州赛区网赛)(bfs)
		Problem Description <Journey to the West>(also <Monkey>) is one of the Four Great Classi ... 
- HDU 5025  Saving Tang Monk
		Problem Description <Journey to the West>(also <Monkey>) is one of the Four Great Classi ... 
- 2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)
		/* 这是我做过的一道新类型的搜索题!从来没想过用四维数组记录状态! 以前做过的都是用二维的!自己的四维还是太狭隘了..... 题意:悟空救师傅 ! 在救师父之前要先把所有的钥匙找到! 每种钥匙有 k ... 
- HDU 5025  Saving Tang Monk(状态转移, 广搜)
		#include<bits/stdc++.h> using namespace std; ; ; char G[maxN][maxN], snake[maxN][maxN]; ]; int ... 
- HDU 5025 Saving Tang Monk --BFS
		题意:给一个地图,孙悟空(K)救唐僧(T),地图中'S'表示蛇,第一次到这要杀死蛇(蛇最多5条),多花费一分钟,'1'~'m'表示m个钥匙(m<=9),孙悟空要依次拿到这m个钥匙,然后才能去救唐 ... 
随机推荐
- php方法-------将汉字转为拼音或者提取汉字首字母
			将汉字转为全拼,提取汉字首字母 <?php /** * 基于PHP语言的汉语转拼音的类 * 兼容 UTF8.GBK.GB2312 编码,无须特殊处理 * 对中文默认返回拼音首字母缩写,其它字符不 ... 
- php字符处理
			1.strstr 截取某个字符后的字符: echo strstr("123456789","5");//输出:6789 
- Linux 进程及作业管理
			进程简介: 内核的功用:进程管理.文件系统.网络功能.内存管理.驱动程序.安全功能 进程(Process):什么是进程,进程是程序的执行实例,即运行中的程序,同时也是程序的一个副本:程序是放置于磁 ... 
- Qt编程—去掉标题栏和设置窗口透明用法
			学习Qt编程,有时候我们很想做出好看又比较炫的画面,这时就常用到qt上的一些技巧. 这里我以一个小例子来展示qt的这些技巧,此qt编程写的,如图:(去掉标题栏和设置窗口透明后) 代码实现部分: .h文 ... 
- vue如何每次打开子组件弹窗都进行初始化
			:visible.sync 与 v-if同时使用即可. 
- 小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系)
			小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系 1. 依赖关系. 最轻的一种关系 在方法中引入另一个类的对象 class Elephant: def __init__(sel ... 
- [luogu]  P4551 最长异或路径(贪心)
			P4551 最长异或路径 题目描述 给定一棵\(n\)个点的带权树,结点下标从\(1\)开始到\(N\).寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或 ... 
- [luogu] P4364 [九省联考2018]IIIDX(贪心)
			P4364 [九省联考2018]IIIDX 题目背景 Osu 听过没?那是Konano 最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在,他在世界知名游戏公司KONMAI ... 
- [WPF] 圆形等待效果
			原文:[WPF] 圆形等待效果 自己做着玩儿的,留着以后用,效果类似下面的 GIF 动画. <Grid Width="35" Height="35"> ... 
- 【codeforces 810C】Do you want a date?
			[题目链接]:http://codeforces.com/contest/810/problem/C [题意] 给你一个集合,它包含a[1],a[2]..a[n]这n个整数 让你求出这个集合的所有子集 ... 
