题目链接小白月赛26 牛牛走迷宫
题目大意
一个n行,m列的只包含0和1矩阵,0表示可以走,1表示不能走。,从{1,1}开始移动,一次移动一格,可以向上下左右移动,条路径步数一样,他会选择走字典序最小的那条。。
输出要求:如果牛牛不能走到终点,请输出"-1",如果可以走到终点,第一行请输出牛牛的最小步数k。
接下来一行,输出一个长度为k的字符串(仅包含’D’、‘L’、‘R’、‘U’)表示牛牛的路径。(D表示向下,L表示向左,R表示向右,U表示向上)
分析:
要遍历所有的路径,可以用BFS来进行搜索,向四个方向走可以把四个方向先按字典序排列(即’D’、‘L’、‘R’、‘U’),按此顺序来搜索,这样最终得到的字符串就是最小字典序,最先走到(n,m)的路径即为字符串的最小字典序
走不到了还要输出-1,别问为啥要特别提这一句,问就是wa成傻子了
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>PII;
int dx[4]= {1,0,0,-1},dy[4]= {0,-1,1,0};
char ch[4]= {'D','L','R','U'};
map<PII,string>ma;
map<PII,int>mm;
vector<string>v;
int main() {
int n,m;
cin>>n>>m;
string s[510];
for(int i=0; i<n; i++)
cin>>s[i];
queue<PII>q;
q.push({0,0});
while(q.size()) {
auto t=q.front();
q.pop();
for(int i=0; i<4; i++) {
int x=t.first+dx[i],y=t.second+dy[i];
if(x>=0&&x<n&&y>=0&&y<m&&s[x][y]=='0'&&0==ma[ {x,y}].size()&&(x!=0||y!=0)) {
q.push({x,y});
ma[ {x,y}]=ma[ {x-dx[i],y-dy[i]}]+ch[i];
mm[ {x,y}]=mm[ {x-dx[i],y-dy[i]}]+1;
if(x==n-1&&y==m-1) {
cout<<mm[ {x,y}]<<endl<<ma[ {x,y}];
return 0;
}
}
}
}
cout<<"-1";
}