思特奇杯·云上蓝桥-算法集训营】第2周 迷宫

题目描述

下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以通行的地方。

010000

000100

001001

110000

迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它的上、下、左、右四个方向之一。 对于上面的迷宫,从入口开始,可以按DRRURRDDDR 的顺序通过迷宫, 一共 10 步。其中 D、U、L、R 分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫(30 行 50 列),请找出一种通过迷宫的方式, 其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。 请注意在字典序中D<L<R<U。(如果你把以下文字复制到文本文件中,请务 必检查复制的内容是否与文档中的一致。在试题目录下有一个文件 maze.txt, 内容与下面的文本相同)

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个字符串,包含四种字母 D、U、L、R,在提交答案时只填写这个字符串,填 写多余的内容将无法得分。

这个题并没有什么难的。

我这里写的是题意的那个例子。

答案与题意一致。

代码如下:

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
char map[10][10];
int color[10][10]={0};
const int vx[4]={1,0,0,-1};
const int vy[4]={0,-1,1,0};
struct point {
    int x;
    int y;
    vector<char> a;
};
int main(){
    void bfs(point s);
    point s;
    s.x=0;
    s.y=0;
    for(int i=0;i<4;i++)
        for(int j=0;j<6;j++)
            cin >> map[i][j];
    bfs(s);
    
    return 0;
}
void bfs(point s){
    queue<point> u;
    u.push(s);
    color[0][0]=1;
    int flag=0;


    while(!u.empty()){

        point now=u.front();
        u.pop();
       
        
        if(now.x==3 && now.y==5){
            now.a.push_back('R');
            for(int i=0;i<now.a.size();i++)
                cout << now.a[i] ;
            
            cout << endl;
            return ;
        }
        for(int i=0;i<4;i++){
            point next;
            next.x=now.x+vx[i];
            next.y=now.y+vy[i];
            for(int j=0;j<now.a.size();j++)
                next.a.push_back(now.a[j]);

            if(i==0)
                next.a.push_back('D');
            else if(i==1)
                next.a.push_back('L');
            else if(i==2)
                next.a.push_back('R');
            else if(i==3)
                next.a.push_back('U');
        
            if(next.x>=0 && next.x<4 && next.y>=0 && next.y<6 && !color[next.x][next.y] && map[next.x][next.y]!='1'){
                u.push(next);
                color[next.x][next.y]=1;
            }

           
        }
  

    } 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值