2193 救基友记3 【BFS】
来源:互联网 发布:软件规范介绍 编辑:程序博客网 时间:2024/04/29 13:37
题目描述
话说CZ由于不守基道,被妖怪抓走了,好基友WP在努力讨好高富帅RQ救出CZ的同时,CZ也意识到了自己的错误,然后努力的想逃出妖怪的闺房。
妖怪的闺房是一个n*m的矩阵,并且某些地方安装了带锁的门,钥匙藏在闺房另外的某些地方。刚开始WP被关在(sx,sy)的位置,离开闺房的门在(ex,ey)的位置。WP每分钟只能从一个坐标走到相邻四个坐标中的其中一个。妖怪每t分钟回闺房视察一次,若发现CZ不在原位置便把他再拎回去。经过若干次的尝试,CZ已画出整个闺房的地图。现在请你帮他计算能否再次成功逃亡。只要在妖怪下次视察之前走到出口就算离开闺房,如果妖怪回来的时候刚好走到出口或还未到出口都算逃亡失败。输入
每组测试数据的第一行有三个整数n,m,t(2<=n,m<=20,t>0)。接下来的n行m列为闺房的地图,其中包括:
. 代表路
* 代表墙
@ 代表CZ的起始位置
^ 代表闺房的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j代表钥匙,对应的门分别为A-J
. 代表路
* 代表墙
@ 代表CZ的起始位置
^ 代表闺房的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j代表钥匙,对应的门分别为A-J
每组测试数据之间有一个空行。
输出
针对每组测试数据,如果可以成功逃亡,请输出最少需要多少分钟才能离开,如果不能则输出-1。
示例输入
4 5 17@A.B.a*.*.*..*^c..b*4 5 16@A.B.a*.*.*..*^c..b*
示例输出
16-1
提示
涉及三维的BFS,注意三维,也没什么其他要注意的。
#include <stdio.h>#include <math.h>#include <string.h>struct m{ int x; int y; int z; int num;}q[410000];char Map[30][30];bool tf[30][30][1100];int ax[] = {0,1,0,-1};int ay[] = {1,0,-1,0};char key[10];int k;int pd(int a,char c){ int n = c - 'A' + 1; int i; int num; for (i = 0;i < n;i++) { num = a % 2; a /= 2; } return num;}int bls (int x,int y,int n,int m){ struct m now,next; int s = 0,e = 0; now.x = x; now.y = y; now.z = 0; now.num = 0; tf[x][y][0] = 1; q[s++] = now; while (s > e) { now = q[e++]; if (Map[now.x][now.y] == '^') return now.num; //printf("x = %d y = %d num = %d z = %d\n",now.x,now.y,now.num,now.z); for (int i = 0;i < 4;i++) { next.x = now.x + ax[i]; next.y = now.y + ay[i]; next.z = now.z; if (next.x >= 0 && next.x < n && next.y >= 0 && next.y < m && tf[next.x][next.y][next.z] == 0) { if (Map[next.x][next.y] == '.' || Map[next.x][next.y] == '^' || Map[next.x][next.y] == '@') { next.num = now.num + 1; q[s++] = next; tf[next.x][next.y][next.z] = 1; }else if (Map[next.x][next.y] >= 'a' && Map[next.x][next.y] <= 'j') { int kn = Map[next.x][next.y] - 'a'; if(pd(next.z,Map[next.x][next.y]-'a'+'A') == false) { next.z += pow (2,kn); } next.num = now.num + 1; q[s++] = next; tf[next.x][next.y][next.z] = 1; }else if (Map[next.x][next.y] >= 'A' && Map[next.x][next.y] <= 'J') { if(pd(next.z,Map[next.x][next.y])) { next.num = now.num + 1; q[s++] = next; tf[next.x][next.y][next.z] = 1; } } } } } return -1;}int main(){ int n,m,t; int i,k; while (~scanf ("%d%d%d%*c",&n,&m,&t)) { for (i = 0;i < n;i++) scanf ("%s",Map[i]); memset(tf,0,sizeof (tf)); for (i = 0;i < n;i++) { for (k = 0;k < m;k++) if (Map[i][k] == '@') break; if (k < m) break; } int num = bls (i,k,n,m); if (num < t) printf ("%d\n",num); else printf ("-1\n"); } return 0;}
0 0
- 2193 救基友记3 【BFS】
- 救基友记3(三维bfs)
- 救基友记3(三维bfs)
- SDUT2193_救基友记3(BFS三维)
- 寒假训练--dfs+bfs--救基友记3
- HDU 1429 胜利大逃亡(续) / SDUT 2193 救基友记3 简单的BFS
- hdu 1429胜利大逃亡(续) / sdut 2193 救基友记3(BFS)
- BFS 4 2 3
- POJ_S1E03_DFS&BFS(3)
- BFS
- bfs
- BFS
- BFS
- bfs
- BFS
- bfs
- BFS
- BFS
- java初始化变量的问题
- Java面向对象的程序设计概念
- 树立个人品牌:让名企hr们主动来找你
- OJ_1004 Median 求中位数
- 解剖WebGL应用程序
- 2193 救基友记3 【BFS】
- Unicode 码和汉字,十进制之间互转!二进制、十六进制,十进制的转换
- 关于HTC手机降hboot版本的一个方法
- 单独迁移oracle的SEQUENCE
- dojo省份地市级联之地市封装类(二)
- Python 二三事
- 【SCOI2007】蜥蜴
- 解决google能搜索到,但是链接打不开问题
- java实现多个文件中数据去重问题并按升序排列