一个深刻的经验
Posted NgAgo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个深刻的经验相关的知识,希望对你有一定的参考价值。
一个深刻的经验
在做蓝桥杯ADV-147. 学霸的迷宫这个题目的时候,除了错误
问题描述
学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗。但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫。因为班长还有妹子要陪,磨刀不误砍柴功,他为了节约时间,从线人那里搞到了迷宫的地图,准备提前计算最短的路线。可是他现在正向妹子解释这件事情,于是就委托你帮他找一条最短的路线。
输入格式
第一行两个整数n, m,为迷宫的长宽。
接下来n行,每行m个数,数之间没有间隔,为0或1中的一个。0表示这个格子可以通过,1表示不可以。假设你现在已经在迷宫坐标(1,1)的地方,即左上角,迷宫的出口在(n,m)。每次移动时只能向上下左右4个方向移动到另外一个可以通过的格子里,每次移动算一步。数据保证(1,1),(n,m)可以通过。
输出格式
第一行一个数为需要的最少步数K。
第二行K个字符,每个字符∈{U,D,L,R},分别表示上下左右。如果有多条长度相同的最短路径,选择在此表示方法下字典序最小的一个。
我可以说这道题对我来说值29块钱,出错的原因是我在看题目的时候理解错了,我将n作为行,m作为列了,因为在输入格式这一说明中说n,m为迷宫的长宽,然后导致后面的地图矩阵出错,从而输入的时候不能输完测试数据,然后导致测试超时,和小标越界的可能。因为学校没有给蓝桥杯充钱的远古,所以我拿不到蓝桥杯的测试数据,所以我找到一个网站,充了网站的会员然后看到测试数据的时候我就恍然大悟,原来是一开始的mn输入的时候颠倒了。虽然29元一道题的确有点肉疼呜呜呜发≡(▔﹏▔)≡,但是能正确的认识到这个题目的错误,也让我心里感觉很值得,不过我发现算法题还是蓝桥杯oj强大一点,因为对于迷宫的问题,不能有唯一解,而我下面这个代码无疑是正确的,但是我充值会员的网站的确会认为错误的,当然蓝桥杯是通过了的。
现在附上正确的代码
#include<fstream>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<utility>
#include<string>
using namespace std;
#define W 1
#define G 0
#define B -1
#define U 0
#define D 1
#define L 2
#define R 3
int dx[]={-1,1,0,0};
int dy[]={0,0,1,-1};
int main(){
int n,m;
cin>>n>>m;
if(m<=0||n<=0){
return 0;
}
queue<pair<int,int> > que;
vector<string> map;
int pred[n][m];//前驱列表
int color[n][m];//颜色列表
int dist[n][m];//时序列表
stack<char> way;
//初始化
int index=n;
while(index--){//输入map
string tmp;
cin>>tmp;
map.push_back(tmp);
}
for(int i = 0;i<n;i++){//初始化各列表
for(int j = 0 ; j< m ;j++){
color[i][j]=W;
pred[i][j]=-1;
dist[i][j]=-1;
}
}
color[0][0]=G;
dist[0][0]=0;
que.push(pair<int,int>(0,0));
while(que.size()){
int f=que.front().first;
int s=que.front().second;
for(int i = 0;i<4;i++){
int x=f+dx[i];
int y=s+dy[i];
if(x>=0&&y>=0&&x<n&&y<m&&map[x][y]==\'0\'&&color[x][y]==W){
color[x][y]=G;
que.push(pair<int,int>(x,y));
pred[x][y]=i;
dist[x][y]=dist[f][s]+1;
}
}
color[f][s]=B;
que.pop();
}
int a=n-1,b=m-1;
while(dist[a][b]!=0){
int pre=pred[a][b];
if(pre==0)
way.push(\'U\');
if(pre==1)
way.push(\'D\');
if(pre==2)
way.push(\'R\');
if(pre==3)
way.push(\'L\');
a-=dx[pre];
b-=dy[pre];
}
cout<<dist[n-1][m-1]<<endl;
while(way.size())
{
cout<<way.top();
way.pop();
}
return 0;
}
以上是关于一个深刻的经验的主要内容,如果未能解决你的问题,请参考以下文章