一个深刻的经验

一个深刻的经验

在做蓝桥杯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;
}
posted @ 2021-05-12 00:04  NgAgo  阅读(54)  评论(0编辑  收藏  举报