搜索算法(算法竞赛、蓝桥杯)--双向BFS双向奔赴

1、B站视频链接:B18 双向BFS Nightmare_哔哩哔哩_bilibili

题目链接:Problem - 3085

cpp 复制代码
#include <bits/stdc++.h> 
using namespace std;
const int N=810;
int n,m;
#define x first
#define y second
char g[N][N];  //地图
int vis[N][N]; //2表示女孩走过,1表示男孩走过,0都没走过
pair<int,int> boy,girl,ghost[2]; //存储人、鬼的初始位置
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; //搜索的方向数组

bool check(int x,int y,int tim){
  if(x<0||x>=n||y<0||y>=m||g[x][y]=='X') return false;
  for(int i=0;i<2;i++)
    if(abs(x-ghost[i].x)+abs(y-ghost[i].y)<=tim*2)return false;
  return true; //(x,y)合法则返回true
}
int bfs(){
  int tim=0;
  memset(vis,0,sizeof vis);
  queue<pair<int,int>> qb,qg;
  qb.push(boy); qg.push(girl);
  while(qb.size()||qg.size()){
    tim++; //增加1秒
    for(int i=0;i<3;i++) //男孩走3步
      for(int j=0,s=qb.size();j<s;j++){ //枚举队中所有点
        pair<int,int> t=qb.front(); qb.pop();
        int x=t.x, y=t.y;
        if(!check(x,y,tim)) continue;  //(x,y)非法则跳过
        for(int k=0;k<4;k++){          //4个方向
          int a=x+dx[k], b=y+dy[k];
          if(check(a,b,tim)){            //(a,b)合法
            if(vis[a][b]==2) return tim; //2表示女孩走过
            if(!vis[a][b]) vis[a][b]=1,qb.push({a,b});
          }
        }
      }
    for(int i=0;i<1;i++) //女孩走1步
      for(int j=0,s=qg.size();j<s;j++){
        pair<int,int> t=qg.front();qg.pop();
        int x=t.x, y=t.y;
        if(!check(x,y,tim)) continue;
        for(int k=0;k<4;k++){
          int a=x+dx[k], b=y+dy[k];
          if(check(a,b,tim)){
            if(vis[a][b]==1) return tim; //1表示男孩走过
            if(!vis[a][b]) vis[a][b]=2,qg.push({a,b});
          }
        }
      }
  }
  return -1; //无解返回-1
}
int main(){
  int T;scanf("%d",&T);
  while(T--){
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++) scanf("%s",g[i]);
    for(int i=0,t=0;i<n;i++) //找出人、鬼的位置
      for(int j=0;j<m;j++)
        if(g[i][j]=='M') boy={i,j};
        else if(g[i][j]=='G') girl={i,j};
        else if(g[i][j]=='Z') ghost[t++]={i,j};    
    printf("%d\n",bfs());
  }
}
相关推荐
IUGEI38 分钟前
从原理到落地:DAG在大数据SLA中的应用
java·大数据·数据结构·后端·算法
云深麋鹿40 分钟前
五.排序笔记
c语言·数据结构·算法·排序算法
spcier7 小时前
图论拓扑排序-Kahn 算法
算法·图论
知星小度S7 小时前
动态规划(一)——思想入门
算法·动态规划
ysa0510307 小时前
动态规划-逆向
c++·笔记·算法
燃于AC之乐7 小时前
我的算法修炼之路--7—— 手撕多重背包、贪心+差分,DFS,从数学建模到路径DP
c++·算法·数学建模·深度优先·动态规划(多重背包)·贪心 + 差分
闻缺陷则喜何志丹7 小时前
【BFS 动态规划】P12382 [蓝桥杯 2023 省 Python B] 树上选点|普及+
c++·蓝桥杯·动态规划·宽度优先·洛谷
chinesegf7 小时前
文本嵌入模型的比较(一)
人工智能·算法·机器学习
We་ct8 小时前
LeetCode 6. Z 字形变换:两种解法深度解析与优化
前端·算法·leetcode·typescript
REDcker8 小时前
Redis容灾策略与哈希槽算法详解
redis·算法·哈希算法