题目描述
给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山。平地可以通过,高山则不能。现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能到达目的地(x2,y2)?你只能沿着水平和垂直方向的平地上行进,拐弯次数就等于行进方向的改变(从水平到垂直或从垂直到水平)的次数。例如:如图,最少的拐弯次数为5。
输入
第1行:n m
第2至n+1行:整个地图地形描述(0:空地;1:高山),
如(图)第2行地形描述为:1 0 0 0 0 1 0
第3行地形描述为:0 0 1 0 1 0 0
……
第n+2行:x1 y1 x2 y2 (分别为起点、终点坐标)
输出
输出s (即最少的拐弯次数)
样例输入
5 7
1 0 0 0 0 1 0
0 0 1 0 1 0 0
0 0 0 0 1 0 1
0 1 1 0 0 0 0
0 0 0 0 1 1 0
1 3 1 7
样例输出
5
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int N=100+10;
struct node
{
int x,y,qx,qy,num;
};
int mapa[N][N],n,m,bx,by,ex,ey;
int mx[4]={0,1,-1,0};
int my[4]={1,0,0,-1};
void bfs();
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>mapa[i][j];
cin>>bx>>by>>ex>>ey;
bfs();
return 0;
}
void bfs()
{
queue<node> q;
node qsd;
qsd.x =bx;
qsd.y =by;
qsd.qx=bx;
qsd.qy=by;
qsd.num=0;
q.push(qsd);
while(!q.empty())
{
qsd=q.front();
q.pop();
if(qsd.x==ex&&qsd.y==ey)
{
cout<<qsd.num;
break;
}
node xhhs;
for(int i=0;i<4;i++)
{
xhhs.x=qsd.x+mx[i];
xhhs.y=qsd.y+my[i];
if(xhhs.x>=1&&xhhs.x<=n&&xhhs.y>=1&&xhhs.y<=m&&!mapa[xhhs.x][xhhs.y])
{
if(xhhs.x!=qsd.qx&&xhhs.y!=qsd.qy)
xhhs.num=qsd.num+1;
else
xhhs.num=qsd.num;
xhhs.qx=qsd.x;
xhhs.qy=qsd.y;
q.push(xhhs);
}
}
}
}