原题链接:蓝桥杯算法提高VIP-学霸的迷宫
解题思路:
利用结构体构建节点,其包含数据x,y位置,step走过的步数,way走过的方向存储。
我这一套方法优化程度很低,但是相当好理解。
利用BFS逐个进行搜索,这里需要记住的一点是搜索的顺序必须要按照DLRU这样的字典序进行排列,否则的话会产生一些错误数据。
别忘了使用vis做地图标记,否则的话分分钟爆时。
参考代码:
#include<bits/stdc++.h>
#define hh ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int maxn=1005;
/*
int dir[4][2]= {0,1,0,-1,1,0,-1,0};
//右,左,下,上,四个方向
这样子用方向会错,原因是需要写字典序最小的
*/
int dir[4][2]={1,0,0,-1,0,1,-1,0};
//按照DLRU的字典序进行排列
int vis[maxn][maxn]; //mark map
char mp[maxn][maxn]; //map array
int n,m;
struct state {
int x,y;
int step;
string way;
};
state ans; //答案变量
bool check(state s){
if(!vis[s.x][s.y]&&s.x<n&&s.x>=0&&s.y<m&&s.y>=0){
return true;
}
return false;
}
bool bfs() {
queue<state> q;
state now,next,st;
st.x=0,st.y=0,st.step=0,st.way="";
q.push(st);
vis[st.x][st.y]=1;
while(!q.empty()) {
now=q.front();
if(now.x==n-1&&now.y==m-1) {
ans.x=now.x;
ans.y=now.y;
ans.step=now.step;
ans.way=now.way;
return true;
}
for(int i=0; i<4; i++) {
next.x=now.x+dir[i][0];
next.y=now.y+dir[i][1];
next.step=now.step+1;
switch(i) {
case 0:
next.way=now.way+"D";
break;
case 1:
next.way=now.way+"L";
break;
case 2:
next.way=now.way+"R";
break;
case 3:
next.way=now.way+"U";
break;
}
if(check(next)){
q.push(next);
vis[next.x][next.y]=1;
}
}
q.pop();
}
return false;
}
int main() {
hh;
cin>>n>>m;
memset(vis,0,sizeof(vis));
memset(mp,0,sizeof(mp));
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
cin>>mp[i][j];
if(mp[i][j]=='1') {
vis[i][j]=1;
}
}
}
if(bfs()){
cout<<ans.step<<endl;
cout<<ans.way<<endl;
}else{
cout<<'0'<<endl;
}
return 0;
}0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复