老鼠走迷宫



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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值