题目描述
睁开眼睛,Bob发现自己被困在一个迷宫里了,是做梦么…
不管那么多了,还是先离开为妙。不过由于恐惧,Bob希望找到一条从入口到出口的最短路径,你能帮帮他么?
这个迷宫相当简单,它是一个N*M的矩形区域,每个格点可以通向相邻上下左右四个格点,起点为(1,1),终点为(N,M)。除此之外,迷宫内还有K个点为障碍点,表示他们不可到达,但障碍点不会出现在起点和终点。
输入
组数据输入。
每组数据,第一行N,M,K, 2<=N,M<=50,0<=k<=N*M-2,
接下来k行,每行两个整数xi,yi,表示第i个障碍物的坐标,障碍物之间不会重复,坐标均1<=xi<=N,1<=yi<=M;
输出
每组数据输出一个整数,最短路径长度,如果Bob不能到达终点,则输出-1;
样例输入
5 5 8
4 3
4 5
5 2
2 2
1 5
3 3
5 1
1 4
5 5 8
1 2
2 2
3 2
4 2
2 4
3 4
4 4
5 4
样例输出
8
16
提示
undefined
题目来源
L.G.
#include <iostream>
#include<queue>
#include<cstring>
using namespace std;
int ma[100][100],vis[100][100];
int dirx[4] = {1,-1,0,0}; //四个方向
int diry[4] = {0,0,-1,1};
struct node{
int x,y,step;
} ;
int n,m;
int bfs(){
queue<node> p;
node next,now;
now.x=1,now.y=1,now.step=0;
p.push(now);
while(!p.empty())
{
now=p.front();
p.pop();
for(int i=0;i<4;i++)
{
next=now;
next.x+=dirx[i];
next.y+=diry[i];
next.step++;
if(next.x==n&&next.y==m)return next.step;
if(ma[next.x][next.y]&&!vis[next.x][next.y])
{vis[next.x][next.y]=1;
p.push(next);
}
}
}
return -1;
}
int main(){
int l;
while(cin>>n>>m>>l)
{int x,y;
memset(ma,1,sizeof(ma));
memset(vis,0,sizeof(vis));
for(int i=0;i<=n+1;i++)
ma[i][0]=ma[i][m+1]=0;
for(int i=0;i<=m+1;i++)
ma[0][i]=ma[n+1][i]=0;
for(int i=0;i<l;i++)
{cin>>x>>y;
ma[x][y]=0;
}
cout<< bfs()<<endl;
}
return 0;}