00 问题

描述:

有一只电子老鼠被困在如下图所示的迷宫中。这是一个12*12单元的正方形迷宫,黑色部分表示建筑物,白色部分是路。电子老鼠可以在路上向上、下、左、右行走,每一步走一个格子。现给定一个起点S和一个终点T,求出电子老鼠最少要几步从起点走到终点。

输入:

本题包含一个测例。在测例的第一行有四个由空格分隔的整数,分别表示起点的坐标S(x.y)和终点的坐标T(x,y)。从第二行开始的12行中,每行有12个字符,描述迷宫的情况,其中'X'表示建筑物,'.'表示路.

输出:

输出一个整数,即电子老鼠走出迷宫至少需要的步数。

输入样例:

2 9 11 8
XXXXXXXXXXXX
X......X.XXX
X.X.XX.....X
X.X.XX.XXX.X
X.X.....X..X
X.XXXXXXXXXX
X...X.X....X
X.XXX...XXXX
X.....X....X
XXX.XXXX.X.X
XXXXXXX..XXX
XXXXXXXXXXXX

输出样例:

28

01 思路

01-1 类型

很明显的一个迷宫了,并且要求出电子老鼠最少要几步从起点走到终点,所以是广搜类型。

01-2 算法

  • 第一步:设置入口出口和迷宫本体->init()函数

  • 第二步:bfs主控函数:

    • 队列入出循环

    • 生成四个节点 对四个节点进行判断

      • 如果新坐标为终点坐标,就返回路径长度

      • 其他点:如果不是终点坐标,在迷宫内,未访问过,不是墙,就入队

        • 入队操作:

          x.push(nextx);
          y.push(nexty);
          used[nextx][nexty]=1;
          step[nextx][nexty]=step[prex][prey]+1;
        • 完成入队出队闭环。

    • 输出

02 代码

 1 //电子老鼠闯迷宫
2 #include<iostream>
3 #include<queue>
4 ​
5 using namespace std;
6 ​
7 int map[13][13];//迷宫本体
8 int used[13][13]={0};//走过标记,0为未走,1为已走
9 int step[13][13]={0};//到达当前节点所走的步数
10 int inx,iny,outx,outy,prex,prey,nextx,nexty;
11 //分别是入口,出口,老位置、新位置
12 int dx[4] = {-1,1,0,0};//左右上下
13 int dy[4] = {0,0,-1,1};//左右上下
14 ​
15 void init();
16 int bfs();
17 queue<int>x;
18 queue<int>y;
19 ​
20 int main(){
21 init();//初始化矩阵以及队列
22 cout<<bfs()<<endl;
23 return 0;
24 }
25 void init(){
26 int i,j;
27 char temp;
28 cin >> inx >> iny >> outx >> outy;
29 //初始化这个矩阵,方便起见,从1开始
30 for(i=1;i<13;i++){
31 for(j=1;j<13;j++){
32 cin>>temp;
33 if(temp == 'X'){
34 map[i][j]=1;
35 }
36 else{
37 map[i][j]=0;
38 }
39 }
40 }
41 //起点入队
42 x.push(inx);
43 y.push(iny);
44 used[inx][iny]=1;
45 }
46 int bfs(){//
47 int i;
48 while(!x.empty()&&!y.empty()){
49 prex = x.front();
50 prey = y.front();
51 x.pop();
52 y.pop();
53 //生成当前节点的四个子节点
54 for(i=0;i<4;i++){
55 nextx = prex + dx[i];
56 nexty = prey + dy[i];
57 if(nextx==outx&&nexty==outy){
58 //如果新坐标为终点坐标
59 return(step[prex][prey]+1);
60 }
61 if(nextx>0&&nextx<=12&&nexty>0&&nexty<=12&&used[nextx][nexty]==0&&map[nextx][nexty]==0){
62 x.push(nextx);
63 y.push(nexty);
64 used[nextx][nexty]=1;
65 step[nextx][nexty]=step[prex][prey]+1;
66 }
67 }
68 }
69 return 0;
70 }

最新文章

  1. 锋利的jQuery--Ajax(读书笔记四)
  2. 一些有趣的Javascript技巧
  3. T-SQL实用查询之常用SQL语句
  4. listview 的适配器 getview 随着软件健盘显示和隐藏,出现多个空的position问题
  5. 【转载】JS获取屏幕大小
  6. android 进程间通信---Service Manager(2)
  7. query specified join fetching, but the owner of the fetched association was not present in the select list
  8. CSS 布局Float 【3】
  9. Jquery 的bind(), live(), delegate(), on()绑定事件方式
  10. 9种CSS3 blend模式制作的鼠标滑过图片标题特效
  11. [ios2] ios7UI适配 【转】
  12. noip普及组2005 采药
  13. 【java】文件操作java.io.File
  14. 对于手机APP偷窥个人隐私,你怎么看
  15. Pagedown learning notes
  16. Vue(基础六)_嵌套路由(续)
  17. SAP PI
  18. WebRTC开发基础(WebRTC入门系列3:RTCDataChannel)
  19. Maven启用代理服务器访问
  20. mahout源码分析之DistributedLanczosSolver(六)完结篇

热门文章

  1. Win10 安装WSL2与 Linux子系统
  2. &lt;题解&gt;「LibreOJ NOIP Round #1」序列划分
  3. Python脚本导出AWS EC2资源清单
  4. Android系统编程入门系列之应用内数据保存数据库
  5. Vue指令及自定义指令的使用
  6. 入坑微信小程序必经之路(六)图片上传服务器——WebSercice接口
  7. 5UCMS判断当前栏目高亮(用于当前所在栏目加背景图片或颜色)
  8. 这个 MySQL bug 让我大开眼界
  9. 博客主题——element v2
  10. 让selenium规避网站的检测