问题 1923: [蓝桥杯][算法提高VIP]学霸的迷宫
时间限制: 1Sec 内存限制: 128MB 提交: 486 解决: 94
题目描述
学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗。但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫。因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线。可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线。
输入
第一行两个整数n, m,为迷宫的长宽。
接下来n行,每行m个数,数之间没有间隔,为0或1中的一个。0表示这个格子可以通过,1表示不可以。假设你现在已经在迷宫坐标(1,1)的地方,即左上角,迷宫的出口在(n,m)。每次移动时只能向上下左右4个方向移动到另外一个可以通过的格子里,每次移动算一步。数据保证(1,1),(n,m)可以通过。
输出
第一行一个数为需要的最少步数K。
第二行K个字符,每个字符∈{U,D,L,R},分别表示上下左右。如果有多条长度相同的最短路径,选择在此表示方法下字典序最小的一个。
样例输入
3 3 001 100 110
样例输出
4 RDRD
就是注意一下方向
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int n,m;
int dx[] = {1,0,0,-1};
int dy[] = {0,-1,1,0};
char path[4]={'D' ,'L','R','U'};
struct NODE{
int x,y,k;
string s;
} t;
vector< vector<int> > a;
int ans = 999999;
string anspath;
void bfs( ){
t.x =1;
t.y =1;
t.k =0;
t.s ="";
queue< struct NODE > q;
q.push( t );
while( !q.empty() ){
struct NODE tmp = q.front();
if( tmp.x==n && tmp.y == m ){
if( ans > tmp.k ){
ans = tmp.k;
anspath = tmp.s;
}
else if( ans == tmp.k ){
for( int i=0;i<anspath.length();i++){
if( anspath[i] > tmp.s[i] ){
anspath = tmp.s;
break;
}
}
}
}
q.pop();
for( int i=0;i<=3;i++){
t.x = tmp.x + dx[i];
t.y = tmp.y + dy[i];
t.s = tmp.s + path[i];
t.k = tmp.k + 1;
if( t.x>=1&&t.x<=n && t.y>=1&&t.y<=m && a[t.x][t.y] == 0 ){
a[t.x][t.y] = 1;
q.push( t );
}
}
}
}
int main(void){
cin>>n>>m;
a.resize(n+1);
for( int i=0;i<=n;i++)
a[i].resize( m +1 );
for( int i=1;i<=n;i++){
string tt;
cin>>tt;
for( int j=1;j<=m;j++){
if( tt[j-1] == '0' )
a[i][j] = 0;
else a[i][j] = 1;
}
}
bfs( );
cout<<ans<<endl<<anspath<<endl;
return 0;
}