最少步数
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
这有一个迷宫,有0~8行和0~8列:
1,1,1,1,1,1,1,1,1
1,0,0,1,0,0,1,0,1
1,0,0,1,1,0,0,0,1
1,0,1,0,1,1,0,1,1
1,0,0,0,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,10表示道路,1表示墙。
现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?
(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int mg[9][9]=
{
1,1,1,1,1,1,1,1,1,
1,0,0,1,0,0,1,0,1,
1,0,0,1,1,0,0,0,1,
1,0,1,0,1,1,0,1,1,
1,0,0,0,0,1,0,0,1,
1,1,0,1,0,1,0,0,1,
1,1,0,1,0,1,0,0,1,
1,1,0,1,0,0,0,0,1,
1,1,1,1,1,1,1,1,1
};
int visit[9][9];
struct num
{
int x,y,step;
};
queue<num> Q;
int bfs(int x1,int y1,int x2,int y2)
{
num e= {x1,y1,0};
visit[x1][y1]=1;//标记走过
Q.push(e);
while(!Q.empty())
{
e=Q.front();//取队首,进行判断是否可走
if(e.x==x2&&e.y==y2)
break;//走到终点
Q.pop();
int l,r;
for(int i=0; i<4; i++)
{
switch(i)
{
case 0:
l=e.x;
r=e.y+1;
break;
case 1:
l=e.x+1;
r=e.y;
break;
case 2:
l=e.x;
r=e.y-1;
break;
case 3:
l=e.x-1;
r=e.y;
break;
}
if(l>=0&&l<=8&&r>=0&&r<=8&&visit[l][r]==0&&mg[l][r]==0)
{
num e1= {l,r,e.step+1};
Q.push(e1);
visit[l][r]=1;
}
}
}
while(!Q.empty())
{
Q.pop();
}
return e.step;
}
int main()
{
int n;
cin>>n;
while(n--)
{
memset(visit,0,sizeof(visit));
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
int st= bfs(x1,y1,x2,y2);
cout<<st<<endl;
}
return 0;
}