蓝桥杯赛迷宫_c++

本文介绍了一种通过遍历算法解决蓝桥杯竞赛中的迷宫问题的方法,目标是在给定的字符迷宫中找到能够组成的最长LQBS序列,通过递归深度优先搜索实现路径查找,并判断是否存在无限循环的可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

把一个 n 行 m 列的字符阵列看做一个迷宫,迷宫仅包含 L、Q、B、S 中的大写母(蓝桥杯赛的汉语拼音首字母)。初始时,你可以从任意一个“L”字母开始,移向相邻的“Q”字母,然后从此“Q”字母出发,移向相邻的“B”字母,然后从此“B”字母出发,移向相邻的“S”字母……。这样,你就算是走过了一个“LQBS”字符序列。接下来,仍然可以从此“S”字母出发,移向相邻的“L”字母……,重复上述的动作,你就可以不断地走过“LQBS”序列。请注意,所谓相邻仅包含上、下、左、右 44 个方向,且只能从 L->Q,从 Q->B,从B->S,从 S->L。可以想像,由于选择的出发点不同,我们有可能在迷宫中走过无数次的“LQBS”,或者是有限次的“LQBS”,或者一次也走不了。编程实现:请你编写程序,求出在给定的迷宫中,我们最多可以走过多少次“LQBS”?

输入格式

第一行:正整数 n,m,表示迷宫的规模为n 行 m 列;接下来的 n 行:每行 m 个符合题意的字母,字母间无空格。

输出格式

一个整数。即:如果在迷宫中可以无限次的走过“LQBS”,输出−1−1,否则,输出可以走过“LQBS”的最多次数

输入数据 1

1 2
LQ

Copy

输出数据 1

0

Copy

输入数据 2

3 3
LSB
QBQ
BSL

Copy

输出数据 2

-1

Copy

输入数据 3

4 4
BLQB
BBQS
SBQL
QQQQ

Copy

输出数据 3

2

Copy

数据规模与约定

对于 100%100% 的数据 , 0≤n,m≤100。

正文部分:

写个函数,暴力枚举吧(已AC)

#include<iostream>
#include<algorithm>
#include<fstream>
using namespace std;
const int N=110;
char g[N][N];
int f[N][N];
int n,m;
bool wuxian;
int mstep,step=1;
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
void dfs(int x,int y){
    for(int i=0;i<4;i++){
        int xx=x+dx[i],yy=y+dy[i];
        if(xx<0||xx>n-1||yy<0||yy>m-1)continue;
        if((g[x][y]=='L' && g[xx][yy]=='Q')||(g[x][y]=='Q' && g[xx][yy]=='B')||
        (g[x][y]=='B' && g[xx][yy]=='S')||(g[x][y]=='S' && g[xx][yy]=='L')){
            if(f[xx][yy]){
                wuxian=true;
                return ;
            }
            f[xx][yy]=1;
            step++;
            mstep=max(mstep,step);
            dfs(xx,yy);
            f[xx][yy]=0;
            step--;
        }  
    }
    return ;
}
int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++) cin>>g[i];
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(g[i][j]=='L'){
                memset(f,0,sizeof(f));
                dfs(i,j);
            }
            if(wuxian){
                cout<<-1<<endl;
                return 0;
            }
        }
    }
    cout << mstep/4 << endl;
    return 0;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值