问题 B: 逃离迷宫二

时间限制: 1 Sec  内存限制: 128 MB
提交: 12  解决: 5
[提交][状态][讨论版]

题目描述

王子深爱着公主。但是一天,公主被妖怪抓走了,并且被关到了迷宫。经过了常人难以想像的努力,王子到了这个迷宫,但是迷宫太过复杂,王子想知道到底有没有路能通到公主的所在地,同时还要输出王子到公主的最短距离,机智的你一定能帮助他解决这个问题。

输入

有多个测试数据。
 
每个测试数据的第一行是2个整数n,m (0<n<50,  0<m<50)代表着迷宫的高度和宽度。
 
接着是个n*m的迷宫抽象图。其中,'#'代表着墙壁,'.'代表着空地,'W'代表着王子的所在地。‘G’代表这公主的所在地,
 
王子只可以在空地上走,并且只能上,下,左,右的走。

输出

如果王子能到达公主的所在地,输出最短的距离
 
否则输出"Mission Failed"

样例输入

5 5
#####
#G..#
###.#
#..W#
#####

样例输出

4
 
DFS代码:
 #include<stdio.h>
#include<malloc.h>
#include<string.h> char Graph [][];
int n,m,startx,starty;
int Dir [][] = {{,},{,},{-,},{,-}};
int Vis [][]; int Fit(int x , int y){
return ( x>= && x<= n && y>= && y<= m );
} int DFS (int x,int y){
int i;
Vis [x][y] = ;
for(i = ; i < ; i++ ){
int tmpx = x + Dir [i][];
int tmpy = y + Dir [i][]; if(Fit (tmpx , tmpy) && Graph [tmpx][tmpy] == 'G'){
return ;
} if(Fit (tmpx , tmpy) && Vis [tmpx][tmpy] == && Graph [tmpx][tmpy] == '.'){
if (DFS (tmpx ,tmpy)){
return ;
}
}
}
return ;
} int main(){
int i ,j ;
while(scanf("%d%d",&n,&m)!=EOF){
getchar(); for( i= ; i <= n ; i++ ){
for( j= ; j<=m ; j++ ){
Vis [i][j] = ;
scanf("%c", &Graph [i][j]);
if(Graph [i][j] == 'W'){
startx = i;
starty = j;
}
}
getchar();
} if(DFS(startx , starty)){
printf("Good life\n");
}
else{
printf("Mission Failed\n");
}
}
return ;
}

BFS代码:

 #include<stdio.h>
#include<malloc.h>
#include<string.h> char Graph [][];//以二维数组记录图
int n,m,startx,starty;
int Dir [][] = {{,},{,},{-,},{,-}};//方向数组
int Vis [][];//记录是否已经访问过
int Dis [][];//记录遍历的层数 int Fit(int x , int y){//判断是否超出边界
return ( x>= && x<= n && y>= && y<= m );
} int BFS (int x , int y){
int queue[];
int i , head = , tail = ;//head指向队列头,tail指向队列尾 queue [tail++] = x ;
queue [tail++] = y ;
Vis [x][y] = ; while(head < tail){//当队列为空停止搜索
int nowx = queue [head++];//取出队首x元素
int nowy = queue [head++];//取出队首y元素 for(i = ; i < ; i++){
int tmpx = nowx + Dir [i][];
int tmpy = nowy + Dir [i][]; if(Fit (tmpx,tmpy) && Graph [tmpx][tmpy] == 'G'){
return Dis [nowx][nowy] + ;//返回值为当前层数
} if(Fit(tmpx ,tmpy) && Vis [tmpx][tmpy] == && Graph [tmpx][tmpy] == '.' ){
//如果下层没有超出界限,并且没有访问过,并且为合法路径,则继续走下去
Dis [tmpx][tmpy] = Dis [nowx][nowy] + ;
Vis [tmpx][tmpy] = ; queue [tail++] = tmpx;
queue [tail++] = tmpy;
}
}
}
return ;//如果出不了迷宫,则返回为0
} int main(){
int i ,j ;
while(scanf("%d%d",&n,&m)!=EOF){
getchar(); for( i= ; i <= n ; i++ ){
for( j= ; j <= m ; j++ ){
Vis [i][j] = ;
scanf("%c", &Graph [i][j]);
if(Graph [i][j] == 'W'){
startx = i;
starty = j;
}
}
getchar();
} int ans = ;
ans = BFS(startx , starty); if(ans)
printf("%d\n",ans);
else
printf("Mission Failed\n");
}
return ;
}

BFS 、DFS 解决迷宫入门问题的更多相关文章

  1. 算法基础③--DFS解决迷宫问题入门

    迷宫问题 通过深度优先搜索(DFS)方法实现. 迷宫问题一 一天蒜头君掉进了一个迷宫里面,蒜头君想逃出去,可怜的蒜头君连迷宫是否有能逃出去的路都不知道. 看在蒜头君这么可怜的份上,就请聪明的你告诉蒜头 ...

  2. HDU 2102 A计划(BFS/DFS走迷宫)

    A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  3. 有关dfs、bfs解决迷宫问题的个人见解

    可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...

  4. bfs,dfs区别

    一般来说用DFS解决的问题都可以用BFS来解决. DFS(深搜的同时考虑回溯) bfs=队列,入队列,出队列:dfs=栈,压栈,出栈 bfs是按一层一层来访问的,所以适合有目标求最短路的步数,你想想层 ...

  5. 用深度优先搜索(DFS)解决多数图论问题

    前言 本文大概是作者对图论大部分内容的分析和总结吧,\(\text{OI}\)和语文能力有限,且部分说明和推导可能有错误和不足,希望能指出. 创作本文是为了提供彼此学习交流的机会,也算是作者在忙碌的中 ...

  6. LeetCode:BFS/DFS

    BFS/DFS 在树专题和回溯算法中其实已经涉及到了BFS和DFS算法,这里单独提出再进一步学习一下 BFS 广度优先遍历 Breadth-First-Search 这部分的内容也主要是学习了labu ...

  7. hdu 1312:Red and Black(DFS搜索,入门题)

    Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  8. POJ 2227 The Wedding Juicer (优先级队列+bfs+dfs)

    思路描述来自:http://hi.baidu.com/perfectcai_/item/701f2efa460cedcb0dd1c820也可以参考黑书P89的积水. 题意:Farmer John有一个 ...

  9. 邻结矩阵的建立和 BFS,DFS;;

    邻结矩阵比较简单,, 它的BFS,DFS, 两种遍历也比较简单,一个用队列, 一个用数组即可!!!但是邻接矩阵极其浪费空间,尤其是当它是一个稀疏矩阵的时候!!!-------------------- ...

随机推荐

  1. python自定义排序函数

    Python内置的 sorted()函数可对list进行排序: >>>sorted([36, 5, 12, 9, 21]) [5, 9, 12, 21, 36] 但 sorted() ...

  2. IOS UIActionSheet的使用方法

    在IOS的用户接口向导中,苹果提供了另外一种显示警告框的手法,叫做UIActionSheet.它和UIAlertView比起来不会显得过于急切和紧张.而是很温和地在继续流程之前给用户提供了诸多选择. ...

  3. NET Core Docker部署

    NET Core Docker部署 前言 在前面文章中,介绍了 ASP.NET Core在 macOS,Linux 上基于Nginx和Jexus的发布和部署,本篇文章主要是如何在Docker容器中运行 ...

  4. Jacob

    http://www.cnblogs.com/luckyxiaoxuan/archive/2012/06/13/2548331.html http://blog.csdn.net/qingwangyo ...

  5. Qt中QFtp获取带有中文的文件名称出现乱码的解决方法(执行操作前就转换编码)

    今天研究了一下QFtp这个类,发现访问得到的文件名称中一旦出现中文,不管怎么转换编码格式,最终显示出来的始终都是乱码.由于编码错误,我写了两个函数用于互相转换编码. 一个是由正常编码转为QFTP上所谓 ...

  6. CreateFile,ReadFile等API详解(或者说MSDN的翻译)

    一.*****CreateFile***** 这个函数可以创建或打开一个对象的句柄,凭借此句柄就可以控制这些对象:控制台对象.通信资源对象.目录对象(只能打开).磁盘设备对象.文件对象.邮槽对象.管道 ...

  7. zend framework多模块配置

    上次接触zend framework已经很久远了,10年的事情了.最近在做一个项目,时间不紧,就又把ZF拿出来折腾.而我发现以前做ZF的记忆已经在我脑中如梦幻泡影,消失无踪,为了配置多模块还又去查了资 ...

  8. IOS文件沙盒

    在进行IPhone开发的时候,常常需要将简单的数据保存到文件中,以便下次再重新打开的时候能够读取文件中保存的数据. 下面就来做一个简单的demo: 步骤: 1.创建一个SingleView项目,带有x ...

  9. 前端性能监控系统ShowSlow

    作者:zhanhailiang 日期:2014-11-14 1. 简单介绍 ShowSlow是开源的前端性能监控系统,提供了下面功能: 前端性能指标数据收集功能:ShowSlow原生提供了数据收集工具 ...

  10. GDI+入门——带你走进Windows图形的世界

    一.GDI+基础 1.GDI+简单介绍 GDI+是微软的新一代二维图形系统,它全然面向对象,要在Windows窗口中显示字体或绘制图形必需要使用GDI+.GDI+提供了多种画笔.画刷.图像等图形对象, ...