问题 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. codeforces 522D. Closest Equals 线段树+离线

    题目链接 n个数m个询问, 每次询问输出给定区间中任意两个相同的数的最近距离. 先将询问读进来, 然后按r从小到大排序, 将n个数按顺序插入, 并用map统计之前是否出现过, 如果出现过, 就更新线段 ...

  2. python 从数据库表生成model

    python 从数据库表生成model 找了很久才找到这个,我是新手... 现在已有建好的数据库,需要基于原有数据做数据分析的web应用,我选择python+Tornado ,由于不想写SQL语句,就 ...

  3. web附件中文名

    response.setHeader("Content-Disposition", "attachement;filename="+URLEncoder.enc ...

  4. Windows10笔记本双显卡导致的启动黑屏解决办法之一

    参考链接:http://www.zhihu.com/question/33662311 大概就是关掉ulps. ulps,显卡的多核心超低功率状态,节能用的,AMD出的双显卡的一种节能方案.不过,与某 ...

  5. Hibernate 知识提高

    主键生成策略有: UUID,increment.Hilo.assigned:对数据库无依赖 identity:依赖Mysql或sql server,主键值不由hibernate维护 sequence: ...

  6. hdoj 3062 Party(2-SAT)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3062 思路分析:将问题转换为2-SAT问题,需要注意的是将命题转换为有向图的方法:命题中A1, A2, ...

  7. Sumsets(完全背包)

    Sumsets Time Limit: 2000MS   Memory Limit: 200000K Total Submissions: 15045   Accepted: 5997 Descrip ...

  8. 几种经典排序算法的JS实现

    一.冒泡排序 function BubbleSort(array) { var length = array.length; for (var i = length - 1; i > 0; i- ...

  9. ThinkPHP - 登录模块,核心代码

    /** * 登录成功 * @return [type] [description] */ public function checkLogin($data) { $user = M($this-> ...

  10. 读书笔记之MERGE 语句使用

    常用语法 MERGE INTO <target table> AS TGT USING <SOURCE TABLE> AS SRC ON <merge predicate ...