zoukankan      html  css  js  c++  java
  • 九度OJ 1335:闯迷宫 (BFS)

    时间限制:1 秒

    内存限制:32 兆

    特殊判题:

    提交:1782

    解决:483

    题目描述:

    sun所在学校每年都要举行电脑节,今年电脑节有一个新的趣味比赛项目叫做闯迷宫。
    sun的室友在帮电脑节设计迷宫,所以室友就请sun帮忙计算下走出迷宫的最少步数。
    知道了最少步数就可以辅助控制比赛难度以及去掉一些没有路径到达终点的map。
    比赛规则是:从原点(0,0)开始走到终点(n-1,n-1),只能上下左右4个方向走,只能在给定的矩阵里走。

    输入:

    输入有多组数据。
    每组数据输入n(0<n<=100),然后输入n*n的01矩阵,0代表该格子没有障碍,为1表示有障碍物。
    注意:如果输入中的原点和终点为1则这个迷宫是不可达的。

    输出:

    对每组输入输出该迷宫的最短步数,若不能到达则输出-1。

    样例输入:
    2
    0 1
    0 0
    5
    0 0 0 0 0
    1 0 1 0 1
    0 0 0 0 0
    0 1 1 1 0
    1 0 1 0 0
    样例输出:
    2
    8

    思路:

    求迷宫最少步数自然用BFS。


    代码:

    #include <stdio.h>
    #include <limits.h>
     
    #define N 100
    #define INF (INT_MAX/2)
     
    typedef struct node {
        int x;
        int y;
        int s;
        int v;
        int d;
    } Point;
     
    int n;
    Point p[N][N];
    Point *queue[N*N+1];
    int front, rear;
     
    void initQueue()
    {
        front = rear = 0;
    }
     
    int isEmpty()
    {
        return front == rear;
    }
     
    void push(Point *p1)
    {
        queue[rear++] = p1;
    }
     
    Point *pop()
    {
        return queue[front++];
    }
     
    void init()
    {
        int i, j;
        initQueue();
        for (i=0; i<n; i++)
        {
            for (j=0; j<n; j++)
            {
                scanf("%d", &(p[i][j].s));
                p[i][j].x = i;
                p[i][j].y = j;
                p[i][j].d = INF;
                p[i][j].v = p[i][j].s;
            }
        }
    }
     
    int legal(int x, int y)
    {
        return x>=0 && x<n && y>=0 && y<n;
    }
     
    void BFS(Point *begin, Point *end)
    {
        int i;
        begin->v = 1;
        begin->d = 0;
        push(begin);
        int t[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        while (!isEmpty())
        {
            Point *p1 = pop();
            for (i=0; i<4; i++)
            {
                int nx = p1->x + t[i][0];
                int ny = p1->y + t[i][1];
                if (legal(nx, ny) && !p[nx][ny].v)
                {
                    Point *np = &p[nx][ny];
                    np->v = 1;
                    np->d = p1->d + 1;
                    if (np == end)
                        return ;
                    push(np);
                }
            }
        }
    }
     
    int main()
    {
        Point *begin, *end;
     
        while(scanf("%d", &n) != EOF)
        {
            init();
            begin = &p[0][0];
            end = &p[n-1][n-1];
            if (begin->s == 1 || end->s == 1)
            {
                printf("-1
    ");
                continue;
            }
            BFS(begin, end);
            if (end->d == INF)
                printf("-1
    ");
            else
                printf("%d
    ", end->d);
        }
        return 0;
    }
    /**************************************************************
        Problem: 1335
        User: liangrx06
        Language: C
        Result: Accepted
        Time:100 ms
        Memory:1188 kb
    ****************************************************************/



    编程算法爱好者。
  • 相关阅读:
    CRM详细介绍网址
    element上传多图片
    多图片上传WebForm
    MemCached原理
    Redis的原理
    Ninject用法详解
    SQLsugar和unity 的用法
    json中的转义字符的处理
    fiddler
    orm多表关系
  • 原文地址:https://www.cnblogs.com/liangrx06/p/5083798.html
Copyright © 2011-2022 走看看