寒假训练--dfs+bfs--救基友记3
2014-02-18 18:58
323 查看
救基友记3
Time Limit: 1000MS Memory limit: 65536K
题目描述
话说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
每组测试数据之间有一个空行。
输出
针对每组测试数据,如果可以成功逃亡,请输出最少需要多少分钟才能离开,如果不能则输出-1。示例输入
4 5 17 @A.B. a*.*. *..*^ c..b* 4 5 16 @A.B. a*.*. *..*^ c..b*
示例输出
16 -1
提示
bfs的问题,但是要抽象为三维的做,将第三维用来存储钥匙的状态,即用三维z的转化为八位二进制数0和1表示一把钥匙的有无,在bfs中每遇到一把钥匙,先判断原本身上有无这把钥匙,如果没有,改变z的值,将钥匙加上, 在遇到门的时候,判断是否有这把门的钥匙, 当遇到^号时,得到最短时间。来源
示例程序
#include <stdio.h> #include <stdlib.h> #include <string.h> char s[30][30] ; int a[30][30][1100] ; struct node { int x , y , z , num ; } p[410000]; int ix[] = {0,0,1,-1}; int jy[] = {1,-1,0,0}; int F(int a,char ch) { int i , n , num ; if(ch >= 'a') n = ch - 'a' + 1; else n = ch - 'A' + 1; for(i = 1 ; i <= n; i++) { num = a % 2 ; a /= 2 ; } return num; } int get(int a,int ch) { int i , n , sum = 1 ; n = ch-'a' ; for(i = 1 ; i <= n ; i++) sum *= 2 ; return (sum+a) ; } int bfs(int i ,int j,int n ,int m,int k) { int low = 0 , top = 0 ; node f , t ; t.x = i ; t.y = j ; t.num = 0 ; t.z = 0 ; p[top++] = t ; a[t.x][t.y][t.z] = 1 ; while(low < top) { t = p[low++] ; if(s[t.x][t.y]=='^' && t.num < k ) { printf("%d\n", t.num); return 0; } for(i = 0 ; i < 4 ; i++) { f.x = t.x + ix[i]; f.y = t.y + jy[i]; f.z = t.z; if(f.x >= 0 && f.x < n && f.y >= 0 && f.y < m && a[f.x][f.y][f.z]==0 ) { if(s[f.x][f.y]=='.' || s[f.x][f.y]=='^' || s[f.x][f.y]=='@' ) { f.num = t.num + 1; p[top++] = f ; a[f.x][f.y][f.z] = 1 ; } else if( s[f.x][f.y] >='a' && s[f.x][f.y] <='j' ) { f.num = t.num + 1; if(F(f.z,s[f.x][f.y])==0) f.z = get(f.z,s[f.x][f.y]); a[f.x][f.y][f.z] = 1 ; p[top++] = f ; } else if(s[f.x][f.y] >='A' && s[f.x][f.y] <='J' && F(f.z,s[f.x][f.y])==1 ) { f.num = t.num + 1; p[top++] = f ; a[f.x][f.y][f.z] = 1 ; } } } } printf("-1\n"); return 0; } int main() { int i , n , j , m , t ; while(scanf("%d %d %d", &n, &m, &t)!=EOF) { for(i = 0 ; i < n ; i++) scanf("%*c%s", s[i]); for(i = 0 ; i < n ; i++) { for(j = 0 ; j < m ; j++) if(s[i][j]=='@') break; if(j < m ) break; } bfs(i,j,n,m,t); } return 0; }
相关文章推荐
- 2018寒假训练-紫皮书-dfs与bfs
- 2018寒假训练-紫皮书-dfs与bfs
- 2018寒假训练-紫皮书-dfs与bfs
- 2018寒假训练-紫皮书-dfs与bfs
- 寒假训练—— HDU - 2094 产生冠军 DFS or BFS
- 寒假训练--图的基本知识--图结构练习——BFSDFS——判断可达性
- 寒假训练--dfs+bfs--找朋友
- DFS-BFS搜索专题【经典训练题】【有时间一个个做下来】
- (编程训练)再回首,数据结构——无向图的邻接矩阵表示、DFS、BFS
- 信息新生训练 BFS,DFS 小朋友的专题作业
- SDAU训练日志第20篇----------DFS和BFS(2)(2018年2月27日)
- SDUT_2015寒假集训_BFS&DFS_D-找朋友
- 蓝桥杯寒假训练二1005 DFS以及三重循环的问题出在memset不能对1进行赋值
- SDUT_2015寒假集训_BFS&DFS_A-数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- SDAU训练日志第19篇----------DFS和BFS(1)(2018年2月26日)
- 寒假第四周训练——DFS题目汇总
- SDUT_2015寒假集训_BFS&DFS_J-Catch That Cow
- 2018年全国多校算法寒假训练营练习比赛第四场 F Call to your teacher 【DFS+BFS】
- HLJU15级寒假培训dfs&bfs题解
- 蓝桥杯寒假训练一1007振兴中华DFS