博客
关于我
老鼠走迷宫
阅读量: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/

你可能感兴趣的文章
protobuf + maven 爬坑记
查看>>
考了400分?不好意思,可能连这些“变态”学校的复试线都没够着!
查看>>
【调剂】其它计算机/软件调剂信息 20.5.20
查看>>
【调剂】211北京邮电大学2020年计算机学院硕士研究生招生缺额信息
查看>>
【招生目录和招生简章】浙江大学 华北电力大学 河南工业大学 福建师范大学...
查看>>
北京理工大学软件学院今年取消招生!
查看>>
这些考研阅卷潜规则你知道几个?
查看>>
【考研英语】考研英语小作文万能模板(致歉信)
查看>>
【数据结构与算法】队列
查看>>
中国最委屈的十所大学
查看>>
【考研经验】2018四跨吉林大学计算机初试复试经验贴(67+72+99+141=379分)
查看>>
【20考研】英语第一轮复习要做的二三事
查看>>
【研究生】PyTorch 1.0稳定版正式发布,并向开发者提供免费AI课程
查看>>
平均分392分!某985计算机专硕复试线暴涨!
查看>>
为何二战考生成功率远远大于应届?
查看>>
计算机专业【本科生】毕业还不如【专科生】?
查看>>
考研408联盟新添一所985!某知名大学专业课改用408!
查看>>
最有钱的大学是哪个?教育部直属高校公布2018年决算
查看>>
408的逆袭!武汉大学所有计算机/软件专业都改为408!
查看>>
408又多一所学校!广东某大学专业课改为408!
查看>>