问题 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. 有意思的C宏

    在Linux内核.嵌入式代码等传统的C代码里,会有一些难以识别的宏定义.我记得在eCos, UBoot, FFmpeg有一些比较BT的宏定义,很难读懂.对于C++程序员来说,最好将这种难读的宏定义转成 ...

  2. chrome extension overview

    目录 什么是扩展............................................................................................ ...

  3. socket 通信 入门3 android 客户端 C# 服务端

    这是一个android端操控服务器的例子  就是发送简单指令到服务器  然后服务器响应什么的... 当然这里是未完成的  只是简单展示一下大致思路 首先连接建立起来后  服务端给客户端一条信息  告诉 ...

  4. jQuery.ui autoComplete使用

    官网  http://api.jqueryui.com/autocomplete/#option-source 参考了 http://www.cnblogs.com/lwme/archive/2012 ...

  5. HDU 3802 Ipad,IPhone

    http://wutyyzchangde.blog.163.com/blog/static/172226566201132311311374/ #include <cstdio> type ...

  6. Book of Evil 树双向DFS

    Book of Evil Paladin Manao caught the trail of the ancient Book of Evil in a swampy area. This area ...

  7. GTW likes math(简单数学)

    GTW likes math  Accepts: 472  Submissions: 2140  Time Limit: 2000/1000 MS (Java/Others)  Memory Limi ...

  8. Just another Robbery(背包)

    1079 - Just another Robbery   PDF (English) Statistics Forum Time Limit: 4 second(s) Memory Limit: 3 ...

  9. URlRewriter组件下载及使用说明

    下载地址:http://www.chx99.cn/file/URLRewriter.rar在web.config添加如下配置节: <httpHandlers>    <add ver ...

  10. html相关介绍

    HTML(超文本标记语言)  超文本标记语言,即HTML(Hypertext Markup Language),是用于描述网页文档的一种标记语言 XHTML1.0 可扩展超文本置标语言(eXtensi ...