电子老鼠闯迷宫

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


#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;


int init();
int bfs();


char s[13][13]={'0'};//初始化同时防止第0行0列的干扰 
int x1,y1,x2,y2;
int step[20][20]; //记录所用的步数 
queue<int>q1; //q1这个队列表示横坐标 
queue<int>q2; //q2表示纵坐标 






int main() 
{
int result,i,j;

cin>>x1>>y1>>x2>>y2;
for(i=1; i<13; i++)
{
for(j=1; j<13; j++)
{
cin>>s[i][j];
}
}
init(); //初始化 

result=bfs(); 

cout<<result<<endl;
return 0;
}




int init()
{
q1.push(x1);
q2.push(y1);
 
step[x1][y1]=0;//记录x1,y1为第0步 
}


int bfs()
{
int x,y,i;
while(!q1.empty())
{
x=q1.front();//把队首元素取出 
q1.pop(); //去除队首元素 
y=q2.front();
q2.pop(); //纵坐标与横坐标对应 
s[x][y]='X'; //给(x,y)这个点做标记,把它从点变成X,保证下次不用它 
if(x==x2&&y==y2) 
{
return (step[x][y]);//找到后输出所用步数 
}

if(s[x-1][y]=='.')//判断它上面是否为. 
{
q1.push(x-1);
q2.push(y); //把x y放入队列,这时候x和y是一一对应的。 
step[x-1][y]=step[x][y]+1;//给步数加一。 
}
if(s[x+1][y]=='.')
{
q1.push(x+1);
q2.push(y);
step[x+1][y]=step[x][y]+1;
}
if(s[x][y-1]=='.')
{
q1.push(x);
q2.push(y-1);
step[x][y-1]=step[x][y]+1;
}
if(s[x][y+1]=='.')
{
q1.push(x);
q2.push(y+1);
step[x][y+1]=step[x][y]+1;
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值