zoukankan      html  css  js  c++  java
  • 蓝桥杯 算法提高 学霸的迷宫

    题目如下:

    问题描述
      学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗。但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫。因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线。可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线。
    输入格式
      第一行两个整数n, m,为迷宫的长宽。
      接下来n行,每行m个数,数之间没有间隔,为0或1中的一个。0表示这个格子可以通过,1表示不可以。假设你现在已经在迷宫坐标(1,1)的地方,即左上角,迷宫的出口在(n,m)。每次移动时只能向上下左右4个方向移动到另外一个可以通过的格子里,每次移动算一步。数据保证(1,1),(n,m)可以通过。
    输出格式
      第一行一个数为需要的最少步数K。
      第二行K个字符,每个字符∈{U,D,L,R},分别表示上下左右。如果有多条长度相同的最短路径,选择在此表示方法下字典序最小的一个。
    样例输入
    Input Sample 1:
    3 3
    001
    100
    110

    Input Sample 2:
    3 3
    000
    000
    000
    样例输出
    Output Sample 1:
    4
    RDRD

    Output Sample 2:
    4
    DDRR
    数据规模和约定
      有20%的数据满足:1<=n,m<=10
      有50%的数据满足:1<=n,m<=50
      有100%的数据满足:1<=n,m<=500。
    -----分割线-----
      经典bfs问题,最短路径+路径存储,代码如下:
    #include<stdio.h>
    #include<string.h>
    #define max 500
    typedef struct Point
    {
        int x;
        int y;
        int step;
    }point; 
    char map[max][max];
    int vis[max][max];
    int road[max][max];
    int move[4][2]={1,0,0,-1,0,1,-1,0};//方便写程序,DLRU,下,左,右,上,字典序
    char s[4]={'D','L','R','U'};
    int l=0,m,n;
    void add(point *A,point p)
    {
        A[l]=p;
        l++;
    }
    void delete(point *A)
    {
        int i;
        for(i=0;i<l;i++)
            A[i]=A[i+1];
        l--;
    }
    void bfs()
    {
        point q[2500];
        point p;
        p.x=0;
        p.y=0;
        p.step=0;
        add(q,p);
        vis[0][0]=1;
        road[0][0]=-1;
        while(l)
        {
            p=q[0];
            delete(q);
            if(p.x==n-1&&p.y==m-1)
            {
                printf("%d
    ",p.step);
                return;//函数执行完毕,退出
            }
            int i,j;
            point pn;
            for(i=0;i<4;i++)
            {
                pn.x=p.x+move[i][0];
                pn.y=p.y+move[i][1];
                pn.step=p.step+1;
                if(pn.x>=0&&pn.x<n&&pn.y>=0&&pn.y<m&&map[pn.x][pn.y]=='0'&&vis[pn.x][pn.y]==0)//在图内且未访问且可访问
                {
                    road[pn.x][pn.y]=i;
                    add(q,pn);
                    vis[pn.x][pn.y]=1;
                }
            }
        }
    }
    void get_road(int x,int y)
    {
        if(x==0&&y==0)
            return;
        get_road(x-move[road[x][y]][0],y-move[road[x][y]][1]);
        printf("%c",s[road[x][y]]);
    }
    int main()
    {
        int i,j;
        scanf("%d%d",&n,&m);
        getchar();
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                scanf("%c",&map[i][j]);
                vis[i][j]=0;
            }
            getchar();
        }
        bfs();
        get_road(n-1,m-1);
        return 0;
    }
  • 相关阅读:
    BZOJ-2462: [BeiJing2011]矩阵模板 (宇宙无敌超级大暴力~)
    BZOJ-3555: [Ctsc2014]企鹅QQ (hash)
    BZOJ-3098: Hash Killer II (未知)
    [SinGuLaRiTy] 2017 百度之星程序设计大赛 初赛A
    [SinGuLaRiTy] 树链问题
    [SinGuLaRiTy] 2017 百度之星程序设计大赛-资格赛
    [SinGuLaRiTy] NOIP模拟赛(TSY)-Day 2
    [SinGuLaRiTy] NOIP模拟赛(TSY)-Day 1
    [SinGuLaRiTy] 2017-07-26 综合性测试
    [SinGuLaRiTy] NOIP 膜你赛-Day 2
  • 原文地址:https://www.cnblogs.com/search-the-universe/p/holiday-8.html
Copyright © 2011-2022 走看看