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