题目链接: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. ZBrush中如何清除遮罩

    在之前的学习中我们知道在ZBrush®中如何创建遮罩,在创建遮罩时怎样进行反转来选择反选遮罩,本文将详细讲解ZBrush中如何清除遮罩,当我们利用遮罩达到预期效果时就需要将遮罩清除了:或者在做了遮罩的 ...

  2. MongoDB_安装

    windows安装MongoDB 官网下载地址:https://www.mongodb.com/download-center?jmp=nav#community (1)如图点击DOWNLOAD进行下 ...

  3. 作用域与this

    面向对象 一.单例模式 1.1 对象数据类型的作用: 把描述一个对象的属性和方法放在一个单独的空间,与其他的对象分割开,即时出现属性名相同的情况,也不会产生冲突 var name="xiao ...

  4. [luogu2501 HAOI2006] 数字序列 (递推LIS)

    题目描述 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. 输入输出格式 输入格式: 第一行包含一个数 ...

  5. IE6 浏览器常见兼容问题 共23个

    1.<!DOCTYPE HTML>文档类型的声明. 产生条件:IE6浏览器,当我们没有书写这个文档声明的时候,会触发IE6浏览器的怪异解析现象: 解决办法:书写文档声明. 2.不同浏览器当 ...

  6. ActiveMQ_Windows和Linux版本的安装部署

    1, 保证电脑上安装了jdk6以上版本的java,并配置了好环境变量 : 2, 官方下载地址:http://activemq.apache.org/download-archives.html ,这里 ...

  7. WinServer-IIS初始安装及发布网站

    \aspnet_regiis.exe –i 还有非常重要的一步就是给发布文件夹设置权限,到底设置那一个用户的权限我也没有弄清楚,大概是IIS_IUSERS或者IUSR用户就可以了,我设置完了之后没有反 ...

  8. [AngularJS]Chapter 2 剖析安哥拉JS应用程序

    不同于普通的框架,你可以从中选择你想用的方法.在anjular中是不同组件写作工作的.这章中,你会看到anjular中基本的组成部分并且理解他们是如何协同工作的.很多组件会在以后的章节中详细讲解.[开 ...

  9. java 日期和字符串互转,依据当天整天时间 得到当天最后一秒的日期时间

    java 日期和字符串互转.依据当天整天时间   得到当天最后一秒的日期时间 package com.hi; import java.text.DateFormat; import java.text ...

  10. Sybase数据库工具DbVisualizer乱码问题

    使用DbVisualizer来操作sybase数据库的时候,会出现乱码问题,中文变成  '口口'. 解决的方法例如以下: 将这三个字体都改成 "宋体"  或者改成 "PM ...