BFS 、DFS 解决迷宫入门问题
问题 B: 逃离迷宫二
时间限制: 1 Sec 内存限制: 128 MB
提交: 12 解决: 5
[提交][状态][讨论版]
题目描述
王子深爱着公主。但是一天,公主被妖怪抓走了,并且被关到了迷宫。经过了常人难以想像的努力,王子到了这个迷宫,但是迷宫太过复杂,王子想知道到底有没有路能通到公主的所在地,同时还要输出王子到公主的最短距离,机智的你一定能帮助他解决这个问题。
输入
输出
样例输入
#####
#G..#
###.#
#..W#
#####
样例输出
#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 解决迷宫入门问题的更多相关文章
- 算法基础③--DFS解决迷宫问题入门
迷宫问题 通过深度优先搜索(DFS)方法实现. 迷宫问题一 一天蒜头君掉进了一个迷宫里面,蒜头君想逃出去,可怜的蒜头君连迷宫是否有能逃出去的路都不知道. 看在蒜头君这么可怜的份上,就请聪明的你告诉蒜头 ...
- HDU 2102 A计划(BFS/DFS走迷宫)
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 有关dfs、bfs解决迷宫问题的个人见解
可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...
- bfs,dfs区别
一般来说用DFS解决的问题都可以用BFS来解决. DFS(深搜的同时考虑回溯) bfs=队列,入队列,出队列:dfs=栈,压栈,出栈 bfs是按一层一层来访问的,所以适合有目标求最短路的步数,你想想层 ...
- 用深度优先搜索(DFS)解决多数图论问题
前言 本文大概是作者对图论大部分内容的分析和总结吧,\(\text{OI}\)和语文能力有限,且部分说明和推导可能有错误和不足,希望能指出. 创作本文是为了提供彼此学习交流的机会,也算是作者在忙碌的中 ...
- LeetCode:BFS/DFS
BFS/DFS 在树专题和回溯算法中其实已经涉及到了BFS和DFS算法,这里单独提出再进一步学习一下 BFS 广度优先遍历 Breadth-First-Search 这部分的内容也主要是学习了labu ...
- hdu 1312:Red and Black(DFS搜索,入门题)
Red and Black Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- POJ 2227 The Wedding Juicer (优先级队列+bfs+dfs)
思路描述来自:http://hi.baidu.com/perfectcai_/item/701f2efa460cedcb0dd1c820也可以参考黑书P89的积水. 题意:Farmer John有一个 ...
- 邻结矩阵的建立和 BFS,DFS;;
邻结矩阵比较简单,, 它的BFS,DFS, 两种遍历也比较简单,一个用队列, 一个用数组即可!!!但是邻接矩阵极其浪费空间,尤其是当它是一个稀疏矩阵的时候!!!-------------------- ...
随机推荐
- python自定义排序函数
Python内置的 sorted()函数可对list进行排序: >>>sorted([36, 5, 12, 9, 21]) [5, 9, 12, 21, 36] 但 sorted() ...
- IOS UIActionSheet的使用方法
在IOS的用户接口向导中,苹果提供了另外一种显示警告框的手法,叫做UIActionSheet.它和UIAlertView比起来不会显得过于急切和紧张.而是很温和地在继续流程之前给用户提供了诸多选择. ...
- NET Core Docker部署
NET Core Docker部署 前言 在前面文章中,介绍了 ASP.NET Core在 macOS,Linux 上基于Nginx和Jexus的发布和部署,本篇文章主要是如何在Docker容器中运行 ...
- Jacob
http://www.cnblogs.com/luckyxiaoxuan/archive/2012/06/13/2548331.html http://blog.csdn.net/qingwangyo ...
- Qt中QFtp获取带有中文的文件名称出现乱码的解决方法(执行操作前就转换编码)
今天研究了一下QFtp这个类,发现访问得到的文件名称中一旦出现中文,不管怎么转换编码格式,最终显示出来的始终都是乱码.由于编码错误,我写了两个函数用于互相转换编码. 一个是由正常编码转为QFTP上所谓 ...
- CreateFile,ReadFile等API详解(或者说MSDN的翻译)
一.*****CreateFile***** 这个函数可以创建或打开一个对象的句柄,凭借此句柄就可以控制这些对象:控制台对象.通信资源对象.目录对象(只能打开).磁盘设备对象.文件对象.邮槽对象.管道 ...
- zend framework多模块配置
上次接触zend framework已经很久远了,10年的事情了.最近在做一个项目,时间不紧,就又把ZF拿出来折腾.而我发现以前做ZF的记忆已经在我脑中如梦幻泡影,消失无踪,为了配置多模块还又去查了资 ...
- IOS文件沙盒
在进行IPhone开发的时候,常常需要将简单的数据保存到文件中,以便下次再重新打开的时候能够读取文件中保存的数据. 下面就来做一个简单的demo: 步骤: 1.创建一个SingleView项目,带有x ...
- 前端性能监控系统ShowSlow
作者:zhanhailiang 日期:2014-11-14 1. 简单介绍 ShowSlow是开源的前端性能监控系统,提供了下面功能: 前端性能指标数据收集功能:ShowSlow原生提供了数据收集工具 ...
- GDI+入门——带你走进Windows图形的世界
一.GDI+基础 1.GDI+简单介绍 GDI+是微软的新一代二维图形系统,它全然面向对象,要在Windows窗口中显示字体或绘制图形必需要使用GDI+.GDI+提供了多种画笔.画刷.图像等图形对象, ...