时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

小Hi正处在由 N × M 个房间组成的矩阵迷宫中。为了描述方便,我们把左上角的房间的坐标定为(0, 0),右下角房间的坐标定为(N-1, M-1)。每个房间可能是3种状态之一:开放的、关闭的、或者上锁的。

开放房间用'.'表示。小Hi可以从一个开放房间到达另一个相邻的(上下左右)开放房间。

关闭房间用'#'表示。小Hi永远不能进入一个关闭的房间。

上锁的房间用大写字母('A', 'B', 'C' ...)表示。小Hi在取得相应的钥匙前不能进入上锁的房间,而一旦取得钥匙就可以反复进入上锁的房间。每个房间的锁都是不同的,相应的钥匙在迷宫中的某一房间里,小Hi进入该房间就可以取得钥匙。

小Hi一开始处于一个开放房间,坐标(ab)。迷宫的出口是一个开放或者上锁的房间,坐标(cd)。假设小Hi每移动到一个相邻房间需要花费单位1的时间,那么小Hi到达出口最少需要花费多少时间?

输入

第一行包含7个整数: N , M , K , a , b , c , d . 其中N , M是矩阵的行列数;K 是上锁的房间数目,(ab)是起始位置,(cd)是出口位置。(1 ≤ NM ≤ 100, 0 ≤ K ≤ 5, 0 ≤ ac < N, 0 ≤ bd < M)

以下 N 行每行包含 M 个字符,表示迷宫矩阵。

再以下 K 行每行两个整数 xy,依次表示上锁房间A , B , C ....的钥匙所在房间坐标。(0 ≤ x < N, 0 ≤ y < M)

输出

输出到达出口的最短时间。如果小Hi永远到达不了出口,输出-1。

样例输入

4 4 2 0 0 0 3
.A.B
.#..
.#..
.#..
3 0
3 3 
样例输出
15

思路:状态压缩。用v[x][y][k]表示在(x,y)这个点是否访问过,k的二进制表示现在身上有多少个钥匙。

#include<cstdio>
#include<queue>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct lenka
{int x,y,sum;
}key[10];
char s[105][105];
int v[105][105][1<<6];
int d[4][2]={-1,0,0,-1,1,0,0,1};
int n,m,ex,ey;
int bfs(int nx,int ny)
{memset(v,0,sizeof v);v[nx][ny][0]=1;queue<struct lenka>p;p.push((lenka){nx,ny,0});while(!p.empty()){lenka now=p.front();p.pop();if(now.x==ex&&now.y==ey)return v[now.x][now.y][now.sum]-1;for(int i=0;i<4;i++){nx=now.x+d[i][0];ny=now.y+d[i][1];if(nx>=0&&nx<n&&ny>=0&&ny<m&&s[nx][ny]!='#'){if(s[nx][ny]=='.'&&v[nx][ny][now.sum]==0){v[nx][ny][now.sum]=v[now.x][now.y][now.sum]+1;p.push((lenka){nx,ny,now.sum});}else if('0'<=s[nx][ny]&&s[nx][ny]<='5'){int sum=now.sum|(1<<(s[nx][ny]-'0'));if(v[nx][ny][sum])continue;v[nx][ny][sum]=v[now.x][now.y][now.sum]+1;p.push((lenka){nx,ny,sum});}else if(s[nx][ny]>='A'&&s[nx][ny]<='Z'){if(now.sum&(1<<(s[nx][ny]-'A'))&&v[nx][ny][now.sum]==0){v[nx][ny][now.sum]=v[now.x][now.y][now.sum]+1;p.push((lenka){nx,ny,now.sum});}}}}}return -1;
}
int main()
{int sx,sy,T;scanf("%d%d%d%d%d%d%d",&n,&m,&T,&sx,&sy,&ex,&ey);for(int i=0;i<n;i++)scanf("%s",s[i]);for(int i=0;i<T;i++){scanf("%d%d",&key[i].x,&key[i].y);s[key[i].x][key[i].y]='0'+i;}printf("%d\n",bfs(sx,sy));return 0;
}

hihocoder #1328 : 逃离迷宫相关推荐

  1. hdu 1728 逃离迷宫 (bfs)

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  2. hdu 4524 郑厂长系列故事——逃离迷宫

    点击打开链接 郑厂长系列故事--逃离迷宫                                                                               T ...

  3. hdoj 1728 逃离迷宫

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. 逃离迷宫的路径(打印路径)

    题目描述 现在有一个5*5的迷宫,起点在左上角,终点在右下角,现在请你来写一个程序计算一下,LZY从起点开始走迷宫,最终能否成功的逃离迷宫? 如果LZY可以逃出迷宫,请输出逃离迷宫的最短路径,否则输出 ...

  5. 逃离迷宫 ( BFS /DFS)

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  6. 郑厂长系列故事——逃离迷宫(C语言)

    郑厂长没变 还是那个假厂长真码农改变的是业余爱好 他现在不研究象棋,改玩游戏了! 最近,郑厂长爱上了逃离迷宫这个游戏,他日日夜夜的玩,就是想达到自己的目标:1000万,因为这个数字和他在腾讯的年收入一 ...

  7. 杭电4524-郑厂长系列故事——逃离迷宫

    郑厂长系列故事--逃离迷宫 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  8. 杭电1728bfs逃离迷宫java实现

    Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有 ...

  9. hdu_1728_逃离迷宫(bfs)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:走迷宫,找最小的拐角 题解:对BFS有了新的理解,DFS+剪枝应该也能过,用BFS就要以拐 ...

  10. HDU 1728 逃离迷宫(BFS的优化)

    这一题,有两个地方需要注意:(除了题目令人窒息的行列的x y设置) ①转弯如何判断? 需要给转弯的方向赋值.通常,我们在节点向四个方向延伸的时候,喜欢这样 int nextx[4]={0,0,-1,1 ...

最新文章

  1. 百度云满速下载(转)
  2. bzoj3959(LCT)
  3. ALV 简单实现HTML抬头的方法 (介绍 一)
  4. Android系统中的进程管理:进程的创建
  5. Build a Machine Learning Portfolio(构建机器学习投资组合)
  6. 多场景下的AI疫情防控“天网”:解读云边端联动下的全栈 AI 技术
  7. apscheduler 脚本执行失败_在脚本中使用 Bash 信号捕获 | Linux 中国
  8. django权限系统实现步骤_在django中实现一个简单的权限管理
  9. [BZOJ5302][HAOI2018]奇怪的背包(DP)
  10. Redis源代码分析(三十)--- pubsub公布订阅模式
  11. MetalSeed 's 网站收藏夹
  12. 计算图的可达矩阵MATLAB程序
  13. ESXI7.0与6.7官网下载地址
  14. 移动端2倍图和3倍图的处理方法
  15. git commit --amend 的使用记录
  16. 怎样用c语言实现CPU超频,cpu超频教程【操作流程】
  17. 数学之美——信息的度量
  18. js ,DOM节点,制作点名器
  19. 巴菲特午餐取消,吃饭行情一地鸡毛
  20. 广东省计算机二级ps操作题题库,广东省计算机二级考试ps选择题.doc

热门文章

  1. 前端面试——安全相关
  2. 笔记本电脑无线Wifi热点设置工具
  3. vue -【nextTick】-【过度与动画】-【插槽】-【配置代理服务器】-【vuex】-【路由】
  4. Deformable DETR进行目标检测,解决size mismatch问题
  5. 站长福音:网站实时监控
  6. 【数据结构】【cfs_rq】【task_struct】【sched_domain】
  7. [sql server] 取汉字 拼音 首字母
  8. windows7旗舰版下载出现蓝屏代码50怎么办?
  9. 为什么阿里巴巴的企业Logo是它?
  10. matlab编译后方交会,摄影测量——后方交会(matlab