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
    ****************************************************************/



    编程算法爱好者。
  • 相关阅读:
    es 基于match_phrase/fuzzy的模糊匹配原理及使用
    感谢帮助我的人们
    ps6—如何安装笔刷
    如何下载安装Photoshop cs 6(供新手)
    axure rp 使用心得
    信安协会作业2
    CentOS7下安装Docker
    20181330 王茜《网络对抗技术》 Exp8 Web综合
    20181330 王茜《网络对抗技术》Exp7 网络欺诈防范
    20181330 王茜《网络对抗技术》Exp6 MSF基础应用
  • 原文地址:https://www.cnblogs.com/liangrx06/p/5083798.html
Copyright © 2011-2022 走看看