推箱子第一部分(一个人从起点走到目的地,不能经过箱子和墙体)

174. 推箱子 - AcWing题库

这道题有点难度,因此我准备分解为两篇文章进行描述,这一篇是简单的bfs,判断一个人是否能从start点走到end点,且不能经过box和墙体。并且把路径存到seq中,并返回bool值。

#include<iostream>
#include<queue>
#include<csstring>
#include<vector>
using namespace std;
typedef pair<int,int> PII;
const int N=25,M=25;
int dx[4]= {-1,1,0,0},dy[4]= {0,0,-1,1};
int n,m;
char g[N][M];
char ops[5]="nswe";
int pre_man[N][M];
PII dist[N][M][4];
vector<int> path[N][M][4];
bool st[N][M][4],vis[N][M];
struct Point {
    int x,y,dir;
} Point[N][M][4];
bool check(int a,int b) {
    return a>=1&&a<=n&&b>=1&&b<=m&&g[a][b]!='#';
}
int bfs_man(PII start,PII end,PII box,vector<int>&seq) {
    memset(vis,0,sizeof(vis));
    memset(pre_man,-1,sizeof(vis));
    queue<PII>q;
    q.push(start);
    vis[start.first][start.second]=true;
    vis[box.first][box.second]=true;
    while(q.size()) {
        PII t=q.front();
        q.pop();
        int x=t.first,y=t.second;
        if(t==end) {
            seq.clear();
            while(~pre_man[x][y]) {
                int d=pre_man[x][y];
                seq.push_back(d);
                x-=dx[d],y-=dy[d];
            }
            return seq.size();
        }
        for(int i=0; i<4; i++) {
            int cx=x+dx[i],cy=y+dy[i];
            if(!check(cx,cy))continue;
            if(vis[cx][cy])continue;
            vis[cx][cy]=true;
            pre_man[cx][cy]=i;
            q.push({cx,cy});
        }
    }
    return -1;
}
  1. 定义了一个二维字符数组g,可能表示一个二维环境或者地图,其中'#'代表障碍物。
  2. dxdy数组用于存储上、下、左、右四个方向的偏移量,分别对应数组中的0、1、2、3。
  3. check函数用于检查一个点是否在地图内且不是障碍物。
  4. bfs_man函数是广度优先搜索的实现。它从一个给定的起始点开始搜索,直到到达终点或无法继续搜索为止。搜索过程中,它会记录已经访问过的点,并避免重复访问。如果到达终点,它会回溯路径并存储在seq中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值