当前位置: 首页 > news >正文

BFS 、DFS 解决迷宫入门问题

问题 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代码:
 1 #include<stdio.h>
 2 #include<malloc.h>
 3 #include<string.h>
 4 
 5 char Graph [80][80];
 6 int n,m,startx,starty;
 7 int Dir [4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
 8 int Vis [80][80];
 9 
10 int Fit(int x , int y){
11     return ( x>=1 && x<= n && y>=1 && y<= m );
12 }
13 
14 int DFS (int x,int y){
15     int i;
16     Vis [x][y] = 1;
17     for(i = 0 ; i < 4 ; i++ ){
18         int tmpx = x + Dir [i][0]; 
19         int tmpy = y + Dir [i][1]; 
20 
21         if(Fit (tmpx , tmpy) && Graph [tmpx][tmpy] == 'G'){
22             return 1;
23         }
24 
25         if(Fit (tmpx , tmpy) && Vis [tmpx][tmpy] == 0 && Graph [tmpx][tmpy] == '.'){
26             if (DFS (tmpx ,tmpy)){
27                 return 1;
28             }
29         }
30     }
31     return 0;
32 }
33 
34 int main(){
35     int i ,j ;
36     while(scanf("%d%d",&n,&m)!=EOF){
37         getchar();
38 
39         for( i=1 ; i <= n ; i++ ){
40             for( j=1 ; j<=m ; j++ ){
41                 Vis [i][j] = 0;
42                 scanf("%c", &Graph [i][j]);
43                 if(Graph [i][j] == 'W'){
44                     startx = i;
45                     starty = j;
46                 }
47             }
48             getchar();
49         }
50 
51         if(DFS(startx , starty)){
52             printf("Good life\n");
53         }
54         else{
55             printf("Mission Failed\n");
56         }
57     }
58     return 0;
59 }

BFS代码:

 1 #include<stdio.h>
 2 #include<malloc.h>
 3 #include<string.h>
 4 
 5 char Graph [80][80];//以二维数组记录图
 6 int n,m,startx,starty;
 7 int Dir [4][2] = {{1,0},{0,1},{-1,0},{0,-1}};//方向数组
 8 int Vis [80][80];//记录是否已经访问过
 9 int Dis [80][80];//记录遍历的层数
10 
11 int Fit(int x , int y){//判断是否超出边界
12     return ( x>=1 && x<= n && y>=1 && y<= m );
13 }
14 
15 int BFS (int x , int y){
16     int queue[9999];
17     int i , head = 0 , tail = 0;//head指向队列头,tail指向队列尾
18 
19     queue [tail++] = x ;
20     queue [tail++] = y ;
21     Vis [x][y] = 1 ;
22 
23     while(head < tail){//当队列为空停止搜索
24         int nowx = queue [head++];//取出队首x元素
25         int nowy = queue [head++];//取出队首y元素
26 
27         for(i = 0 ; i < 4 ; i++){
28             int tmpx = nowx + Dir [i][0];
29             int tmpy = nowy + Dir [i][1];
30 
31             if(Fit (tmpx,tmpy) && Graph [tmpx][tmpy] == 'G'){
32                 return Dis [nowx][nowy] + 1;//返回值为当前层数
33             }
34 
35             if(Fit(tmpx ,tmpy) && Vis [tmpx][tmpy] == 0 && Graph [tmpx][tmpy] == '.' ){
36                 //如果下层没有超出界限,并且没有访问过,并且为合法路径,则继续走下去
37                 Dis [tmpx][tmpy] = Dis [nowx][nowy] + 1;
38                 Vis [tmpx][tmpy] = 1;
39 
40                 queue [tail++] = tmpx;
41                 queue [tail++] = tmpy;
42             }
43         }
44     }
45     return 0;//如果出不了迷宫,则返回为0
46 }
47 
48 int main(){
49     int i ,j ;
50     while(scanf("%d%d",&n,&m)!=EOF){
51         getchar();
52 
53         for( i=1 ; i <= n ; i++ ){
54             for( j=1 ; j <= m ; j++ ){
55                 Vis [i][j] = 0;
56                 scanf("%c", &Graph [i][j]);
57                 if(Graph [i][j] == 'W'){
58                     startx = i;
59                     starty = j;
60                 }
61             }
62             getchar();
63         }
64 
65         int ans = 0;
66         ans = BFS(startx , starty);
67 
68         if(ans)
69             printf("%d\n",ans);
70         else
71             printf("Mission Failed\n");    
72     }
73     return 0;
74 }

 

转载于:https://www.cnblogs.com/wushuaiyi/p/3577463.html

相关文章:

  • STM32之独立看门狗与窗口看门狗总结
  • zoj3713 7Bit
  • USACO Healthy Holsteins DFS
  • 易经读书笔记16 雷地豫
  • 【MM系列】MB1A MB1B MB1C MB11 MIGO的区别解析
  • tf.nn.conv2d 卷积
  • IE6、IE7兼容querySelectorAll和querySelector方法-最终版本
  • 【Linux】Shell批量修改文件名
  • MySQL 查询当天、本周,本月、上一个月的数据
  • NHibernate3.2+Asp.net MVC3+Extjs 4.0.2项目实践(五):Extjs树形导航菜单
  • 利用指针间隔的输出字符串中的字符
  • Java中Httpsession是如何实现的?
  • 《SpringMVC从入门到放肆》十二、SpringMVC自定义类型转换器
  • 洛谷 P1616 疯狂的采药
  • 【BW系列】SAP 讲讲BW/4 HANA和BW on HANA的区别
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • conda常用的命令
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • JAVA多线程机制解析-volatilesynchronized
  • learning koa2.x
  • OSS Web直传 (文件图片)
  • Python 反序列化安全问题(二)
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Redis的resp协议
  • Webpack 4 学习01(基础配置)
  • Zsh 开发指南(第十四篇 文件读写)
  • 如何选择开源的机器学习框架?
  • 十年未变!安全,谁之责?(下)
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 消息队列系列二(IOT中消息队列的应用)
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • Spring Batch JSON 支持
  • Spring第一个helloWorld
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • !!java web学习笔记(一到五)
  • (6)设计一个TimeMap
  • (二开)Flink 修改源码拓展 SQL 语法
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转)nsfocus-绿盟科技笔试题目
  • (转)Sql Server 保留几位小数的两种做法
  • ... 是什么 ?... 有什么用处?
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .a文件和.so文件
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .Net CoreRabbitMQ消息存储可靠机制
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET上SQLite的连接
  • .NET中的Exception处理(C#)
  • @ConfigurationProperties注解对数据的自动封装