NOJ 1793 简单的迷宫 (裸BFS 经典)

简单的迷宫

时间限制(普通/Java):1000MS/3000MS            运行内存限制:65536KByte
总提交:27            测试通过:12

描述

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

 

题目链接  :http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1793

 

题目分析  :最简单的走迷宫,要求最短路,所以用BFS搜索

 

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int const MAX = 55;
int map[MAX][MAX];
int vis[MAX][MAX];
int dirx[4] = {1,-1,0,0};   //四个方向
int diry[4] = {0,0,-1,1};
int n, m, k;
struct Point
{
    int x, y;
    int step;
};

int BFS()
{
    memset(vis,0,sizeof(vis));  //初始化vis
    queue<Point> q;
    Point node, t;
    node.x = 1;
    node.y = 1;
    node.step = 0;
    vis[1][1] = 1;
    q.push(node);   //将起点压入队列
    while(!q.empty())   //队列非空时执行操作
    {
        node = q.front();   //接收队首元素
        q.pop();            //队首出队
        for(int i = 0; i < 4; i++)   //向四个方向走
        {
            t = node;
            t.x += dirx[i];
            t.y += diry[i];
            t.step++;
            if(t.x == n && t.y == m)   //到达终点返回步数
                return t.step;
            //判断该点的可行性
            if(t.x < 1 || t.x > n || t.y < 1 || t.y > n || !map[t.x][t.y] || vis[t.x][t.y]) 
                continue;
            //可行则标记为已访问,该点如队列
            else
            {
                vis[t.x][t.y] = 1;
                q.push(t);
            }
        }
    }
    return -1;
}

int main()
{
    int xi, yi;
    while(scanf("%d %d %d",&n, &m, &k) != EOF)
    {
        memset(map,1,sizeof(map));
        for(int i = 0; i < k; i++)
        {
            scanf("%d %d",&xi, &yi);
            map[xi][yi] = 0;
        }
        printf("%d\n", BFS());
    }
}


 

你可能感兴趣的:(bfs,NOJ)