牛客寒假算法基础集训营6 J-迷宫

本文详细解析了一道基于广度优先搜索(BFS)的模板题,通过构造队列并跟踪可达位置,解决了迷宫中特定条件下可到达的格子数量问题。文章提供了完整的C++代码实现,并介绍了如何使用getchar()函数高效处理输入。

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

题目请点这里

分析:这是一道BFS的模板题,构造一个队列,将每个满足条件的(不超过边界,不超过左右移动次数的限制)位置推入队列,如果不是障碍物且没到达过,就将可到达位置的个数加1

此外,注意这里的输入,输入迷宫的时候是直接输字符串,可以用cin,也可以用getchar()函数

getchar()函数是遇到回车符才会停止,但是它的返回值只有首字符,其他字符都存在缓存区,我们便可以在第一个循环里放一个getchar()来处理回车符,在第二层循环里,实际上只在j=1的时候有输入,

其他时候只不过是读入j=1时存在缓存区里的字符

上代码:

#include <bits/stdc++.h>
using namespace std;
const int inf=1<<30;
typedef long long ll;
const double pi=acos(-1);
const int mod=1e9+7;
const int maxn=1010;
char a[maxn][maxn];
int vis[maxn][maxn];
struct node{
    int x,y,lx,ly;
    node(int x,int y,int lx,int ly): x(x),y(y),lx(lx),ly(ly){}
};
queue<node> q;
int main(){
    int n,m,r,c,x,y;scanf("%d%d%d%d%d%d",&n,&m,&r,&c,&x,&y);
    for(int i = 1; i <= n; i++) {
        getchar();
        for(int j = 1; j <= m; j++)
            a[i][j] = getchar();
    }
    int ans=0;
    q.push(node(r,c,x,y));
    while(!q.empty()){
        node u=q.front();q.pop();
        if(vis[u.x][u.y]||a[u.x][u.y]=='*'){
            continue;
        }
        vis[u.x][u.y]=1;ans++;
        if(u.x>1) q.push(node(u.x-1,u.y,u.lx,u.ly));
        if(u.x<n) q.push(node(u.x+1,u.y,u.lx,u.ly));
        if(u.y>1&&u.lx>0) q.push(node(u.x,u.y-1,u.lx-1,u.ly));
        if(u.y<m&&u.ly>0) q.push(node(u.x,u.y+1,u.lx,u.ly-1));
    }
    cout<<ans<<endl;
    return 0;
}

 

转载于:https://www.cnblogs.com/qingjiuling/p/10350908.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值