题目描述
给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山。平地可以通过,高山则不能。现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能到达目的地(x2,y2)?你只能沿着水平和垂直方向的平地上行进,拐弯次数就等于行进方向的改变(从水平到垂直或从垂直到水平)的次数。例如:如图1,最少的拐弯次数为5。
输入
第1行:n m
第2至n+1行:整个地图地形描述(0:空地;1:高山),
如(图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
Code:
#include<bits/stdc++.h>
using namespace std;
const int dx[4]={0,1,0,-1};
const int dy[4]={1,0,-1,0};
struct point{
int x,y,turn;
}bg,ed,p;
queue<point>q;
int n,m,mp[101][101];
bool used[101][101];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
}
}
cin>>bg.x>>bg.y>>ed.x>>ed.y;
q.push(bg);
q.front().turn=0;
while(!q.empty()){
for(int i=0;i<4;i++){
p.x=q.front().x+dx[i];
p.y=q.front().y+dy[i];
while(p.x>=1&&p.x<=n&&p.y>=1&&p.y<=m&&!mp[p.x][p.y]){
if(!used[p.x][p.y]){
if(p.x==ed.x&&p.y==ed.y){
cout<<q.front().turn<<endl;
return 0;
}
used[p.x][p.y]=1;
p.turn=q.front().turn+1;
q.push(p);
}
p.x+=dx[i];
p.y+=dy[i];
}
}
q.pop();
}
}