题目链接:https://www.dotcpp.com/oj/problem1923.html
题目描述
学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗。但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫。因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线。可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线。
输入
第一行两个整数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},分别表示上下左右。如果有多条长度相同的最短路径,选择在此表示方法下字典序最小的一个。
样例输入
3 3
001
100
110
样例输出
4
RDRD
和一般的算出最短路径不同的是,还要记录方向,之前省赛的时候没有做出来,现在按照大佬的思路做了下(用一个字符串存方向,每次放一个字母),但是只过了83%的样例,歇会儿再改改(第一个是错误版本,第二个是正确版本)
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
const int INF=0x3f3f3f3f;
typedef pair<int,int> P;
int N,M;
int d[][];
char a[][];
int dx[]={,,,-};
int dy[]={,-,,};
char pos[]={'D','L','R','U'};
int sx,sy,gx,gy;
int x,y,nx,ny;
void bfs()
{
memset(d,INF,sizeof(d));
sx=,sy=,gx=N-,gy=M-;
string s="";
queue<P> que;
que.push(P(sx,sy));
d[sx][sy]=;
while(!que.empty()){
P p=que.front();
que.pop();
x=p.first,y=p.second;
if(x==gx&&y==gy) break;
for(int i=;i<;i++){
nx=x+dx[i],ny=y+dy[i];
if(nx>=&&nx<N&&ny>=&&ny<M&&a[nx][ny]!=''&&d[nx][ny]==INF){
s+=pos[i];
que.push(P(nx,ny));
d[nx][ny]=d[x][y]+;
}
}
}
cout<<d[gx][gy]<<endl;
cout<<s<<endl;
}
int main()
{
while(cin>>N>>M){
for(int i=;i<N;i++){
for(int j=;j<M;j++){
cin>>a[i][j];
}
}
bfs();
}
return ;
}
对比了下过了的大佬的代码,自己又改了改,过了。。。区别在于需要给每个结点一个字符串记录路径方向,而不是只用一个字符串记录。。。
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
const int INF=0x3f3f3f3f;
struct node
{
int first,second;
string s;
};
int N,M;
int d[][];
char a[][];
int dx[]={,,,-};
int dy[]={,-,,};
char pos[]={'D','L','R','U'};
int sx,sy,gx,gy;
int x,y,nx,ny;
void bfs()
{
memset(d,INF,sizeof(d));
sx=,sy=,gx=N-,gy=M-;
queue<node> que;
node p;
p.first=sx,p.second=sy,p.s="";
que.push(p);
d[p.first][p.second]=;
node k,l;
while(!que.empty()){
k=que.front();
que.pop();
x=k.first,y=k.second;
if(x==gx&&y==gy) break;
for(int i=;i<;i++){
nx=x+dx[i],ny=y+dy[i];
if(nx>=&&nx<N&&ny>=&&ny<M&&a[nx][ny]!=''&&d[nx][ny]==INF){
l.first=nx,l.second=ny,l.s=k.s+pos[i];
que.push(l);
d[nx][ny]=d[x][y]+;
}
}
}
cout<<d[gx][gy]<<endl;
cout<<k.s<<endl;
}
int main()
{
while(cin>>N>>M){
for(int i=;i<N;i++){
for(int j=;j<M;j++){
cin>>a[i][j];
}
}
bfs();
}
return ;
}