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个钥匙,然后才能去救唐 ...
随机推荐
- servletconfig和servletcontext学习
servletconfig java.lang.String getInitParameter(java.lang.String name) //根据参数名获取参数值 java.util.Enume ...
- Day 03 知识点[python程序运行的方式、变量、注释、内存管理、数据类型]
执行Python程序的两种方式 第一种:交互式,在cmd中运行 优点:调试程序方便,直接给出结果 缺点:无法保存,关掉cmd窗口数据就消失 第二种:命令行式通过cmd中输入Python3文本 优点:数 ...
- 聚类(Clustering)
简介 相对于决策树.朴素贝叶斯.SVM等有监督学习,聚类算法属于无监督学习. 有监督学习通常根据数据集的标签进行分类,而无监督学习中,数据集并没有相应的标签,算法仅根据数据集进行划分. 由于具有出色的 ...
- crm 系统项目(一) 登录,注册,校验
crm 系统项目(一) 登录,注册,校验 首先创建一个Django项目,关于配置信息不多说,前面有~ models.py文件下创建需要的表格信息,之后导入数据库 from django.db impo ...
- js常用事件及事件对象
- Ubuntu 常用快捷键
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50285313 1 桌面 快捷键 作用 ...
- GROUP BY 与聚合函数 使用注意点
表的设计: 表里面的内容: 一:在不使用聚合函数的时候,group by 子句中必须包含所有的列,否则会报错,如下 select name,MON from [测试.] group by name 会 ...
- Android UI布局之TableLayout
从字面上了解TableLayout是一种表格式的布局.这样的布局会把包括的元素以行和列的形式进行排列.表格的列数为每一行的最大列数.当然表格里边的单元格是能够为空的. 实例:LayoutDemo 执行 ...
- 轻松学习JavaScript十七:JavaScript的BOM学习(二)
JavaScript计时事件 通过使用JavaScript中的BOM对象中的window对象的两个方法就是setTimeout()方法和claerTimeout()方法,我们 有能力作到在一个设定的时 ...
- Android开发之使用Web Service进行网络编程
使用Web Service进行网络编程 Android应用通常都是执行在手机平台上.手机系统的硬件资源是有限的,无论是存储能力还是计算能力都有限.在Android系统上开发.执行一些单用户.小型应用是 ...