博客
关于我
老鼠走迷宫
阅读量:282 次
发布时间:2019-03-03

本文共 1836 字,大约阅读时间需要 6 分钟。



/*有一只电子老鼠被困在如下图所示的迷宫中。这是一个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

*/

//        map1[x1][y1]='X' ;//走过之后变成黑格子就不用used了 !!!!!!!!!!!!!!!!!

//        走过之后变成了黑格子就不用used了

#include<iostream>
#include<queue>
using namespace std;
int x1,y1,x2,y2;
char map1[14][14]={0};
int step[14][14]={0};
queue <int> x;
queue <int> y;

void input();
void bfs();

int main()
{
 input() ;  //把地图输入进去
 bfs() ;    //广搜找答案并输出

 return 0 ;

}
void input() //按照题意输入起点、终点的位置和地图
{

 int i , j ;
 cin >> x1 >> y1 >> x2 >> y2 ;

 for(i = 1 ; i <= 12 ; i++)

 {
  for(j = 1 ; j <= 12 ; j++)
  {
   cin >> map1[i][j] ;
  }
 }
     x.push(x1) ;//起点横坐标入队
     y.push(y1) ;//起点纵坐标入队
      step[x1][y1] = 0 ;//起点的步数是0

}

 

void bfs()

{

 while(1) /*这个题肯定会找到答案所以直接括号里填1让它一直跑到终点就OK了 可能empty更官方点吧
          这句话是我的片面理解 其实我就是为了省事*/ 
 {

  if(step[x2][y2] != 0) //找到答案直接output break 大功告成 该干啥干啥去

  {
   cout << step[x2][y2] << endl ;//每走一格步数加1所以走到终点的时候步数就会变为想得到的结果 
   break ; 
  }
  x1=x.front();
        x.pop();
        y1=y.front();
        y.pop();
        map1[x1][y1]='X' ;//走过之后变成黑格子就不用used了!!!!!!!!!!!!!!!!!!!!
  
  //接下来按题意进行四个方向的暴力搜索
     // 我个人觉得这题简单在不用判断越界 少了好多大于号小于号
        // 因为这个map外面是一圈X包着 简单多了
        if(map1[x1][y1 - 1] == '.') // 向上判断
        {
         x.push(x1) ;
         y.push(y1 - 1) ;
         step[x1][y1 - 1] = step[x1][y1] + 1 ;
     }
  if(map1[x1][y1 + 1] == '.') // 向下判断
        {
         x.push(x1) ;
         y.push(y1 + 1) ;
         step[x1][y1 + 1] = step[x1][y1] + 1 ;
     }
  if(map1[x1 - 1][y1] == '.') // 向左判断
        {
         x.push(x1 - 1) ;
         y.push(y1) ;
         step[x1 - 1][y1] = step[x1][y1] + 1 ;
     }
  if(map1[x1 + 1][y1] == '.') // 向右判断
        {
         x.push(x1 + 1) ;
         y.push(y1) ;
         step[x1 + 1][y1] = step[x1][y1] + 1 ;
     }       
 }
}
 

转载地址:http://ncml.baihongyu.com/

你可能感兴趣的文章
深入理解 ClientLifecycleManager 机制
查看>>
android基础知识回顾--ContentProvider简单用法
查看>>
压缩解压
查看>>
js try{}catch(){}finally{}语句
查看>>
ES6 函数模块(四)
查看>>
基于遗传算法(deap)的配词问题与deap框架
查看>>
JavaScript入门
查看>>
PAT (Basic Level) Practice (中文)——1005 继续(3n+1)猜想 (25分)
查看>>
PAT (Basic Level) Practice (中文)——1011 A+B 和 C (15分)
查看>>
vivos7和荣耀x10哪个好 vivos7和荣耀x10区别评测
查看>>
i711700K和r55600x差距大不大 i7 11700K和r5 5600x对比哪个好
查看>>
R3 PRO 3200G和r7 3700u 哪个好
查看>>
入手评测 联想小新Pro14和Air14Plus哪个好?区别对比
查看>>
程序人生:没有伞的孩子要学会奔跑
查看>>
Express Animate for mac(动画特效制作软件)
查看>>
Cookie for Mac(浏览器缓存清理软件)
查看>>
macOS Big Sur系统中如何开启设置触控板三指拖拽功能?
查看>>
Resize Sense for Mac(图像处理软件)
查看>>
TG Pro for mac(硬件温度检测工具)
查看>>
SyncTime for mac(简单的文件同步工具)
查看>>