蓝桥杯 算法提高 学霸的迷宫

题目如下:

问题描述
  学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗。但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫。因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线。可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线。
输入格式
  第一行两个整数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;
}
原文地址:https://www.cnblogs.com/search-the-universe/p/holiday-8.html