题目链接: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 广度搜索 状态压缩的更多相关文章

  1. hdu 5025 Saving Tang Monk(bfs+状态压缩)

    Description <Journey to the West>(also <Monkey>) is one of the Four Great Classical Nove ...

  2. hdu 5025 Saving Tang Monk 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...

  3. 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 ...

  4. [ACM] HDU 5025 Saving Tang Monk (状态压缩,BFS)

    Saving Tang Monk Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  5. ACM学习历程—HDU 5025 Saving Tang Monk(广州赛区网赛)(bfs)

    Problem Description <Journey to the West>(also <Monkey>) is one of the Four Great Classi ...

  6. HDU 5025 Saving Tang Monk

    Problem Description <Journey to the West>(also <Monkey>) is one of the Four Great Classi ...

  7. 2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)

    /* 这是我做过的一道新类型的搜索题!从来没想过用四维数组记录状态! 以前做过的都是用二维的!自己的四维还是太狭隘了..... 题意:悟空救师傅 ! 在救师父之前要先把所有的钥匙找到! 每种钥匙有 k ...

  8. HDU 5025 Saving Tang Monk(状态转移, 广搜)

    #include<bits/stdc++.h> using namespace std; ; ; char G[maxN][maxN], snake[maxN][maxN]; ]; int ...

  9. HDU 5025 Saving Tang Monk --BFS

    题意:给一个地图,孙悟空(K)救唐僧(T),地图中'S'表示蛇,第一次到这要杀死蛇(蛇最多5条),多花费一分钟,'1'~'m'表示m个钥匙(m<=9),孙悟空要依次拿到这m个钥匙,然后才能去救唐 ...

随机推荐

  1. Unity 默认进入的scenes

    1,如果有多个场景,那么第一个场景要放在最上边,(其他的也要加) 2,如果不添加,那么Unity会把当前打开的场景添加进来. 3,切换场景的代码 using UnityEngine.SceneMana ...

  2. IPv6地址分配

  3. CentOS 7编译安装Python3.7.X

    在CentO S上通过编译安装Python3.7,添加python3软链,并使用python3. 环境 安装环境如下: Windows 10 Pro VMWare Workstation 15 Pro ...

  4. PAT 天梯赛练习集 L2-016. 愿天下有情人都是失散多年的兄妹

    题目链接:https://www.patest.cn/contests/gplt/L2-016 呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母. ...

  5. bat启动.exe的应用程序

    新建一个文本文档,编写如下,完成后保存将后缀名txt改为bat即可. rem 启动***(要启动的服务名) @echo off rem  程序安装的顶层目录 d: rem 设置显示文字颜色 color ...

  6. ajax异步请求获取数据,实现滚动数字的效果。

    BackgroundPositionAnimate.js下载 需要导入的js: <script type="text/javascript" src="js/jqu ...

  7. fensorflow 安装报错 DEPENDENCY ERROR

    1.错误信息 DEPENDENCY ERROR The target you are trying to run requires an OpenSSL implementation. Your sy ...

  8. 高级聚合函数rollup(),cube(),grouping sets()

       rollup(),cube(),grouping sets()   上面这几个函数,是对group by分组功能做的功能扩展. a.rollup()   功能:在原结果基础上追加一行总合计记录 ...

  9. SQL SERVER-常用命令2

    1.创建新表 create table mytest ( id int primary key identity(1,1),--主键,自动+1 name varchar(20) unique notn ...

  10. MVC传递数据-传递对象或对象集合

    前言 本文主要介绍从View(或者js)文件向Controller提交对象或者对象集合.比方.将表格中的一行数据作为一个对象提交.或将多行数据作为一个集合提交到Controller. 回想 从View ...