简单的迷宫(bfs)noj1793

题目描述

睁开眼睛,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;}

 

 

posted @ 2015-04-30 19:56  冷夏的博客园  阅读(269)  评论(0编辑  收藏  举报