这道题有点难度,因此我准备分解为两篇文章进行描述,这一篇是简单的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;
}
- 定义了一个二维字符数组
g
,可能表示一个二维环境或者地图,其中'#'代表障碍物。 dx
和dy
数组用于存储上、下、左、右四个方向的偏移量,分别对应数组中的0、1、2、3。check
函数用于检查一个点是否在地图内且不是障碍物。bfs_man
函数是广度优先搜索的实现。它从一个给定的起始点开始搜索,直到到达终点或无法继续搜索为止。搜索过程中,它会记录已经访问过的点,并避免重复访问。如果到达终点,它会回溯路径并存储在seq
中。