首页 > 其他分享 >ACM中的AC题(BFS,三维vis,牛客小白月赛)

ACM中的AC题(BFS,三维vis,牛客小白月赛)

时间:2024-09-07 11:13:45浏览次数:3  
标签:AC temp vis int ACM st 牛客 y1 x1

题目来源:https://ac.nowcoder.com/acm/contest/88878/D
//
题意:迷宫中,两个人,走的每一步两个人的方向都是相反的,问两个人都走到地图中‘@’,最少的步数(地图上多个‘@’)。
//
思路:难点就在可以一个人到了,然后另一个人再独自走,就不用考虑到了那个人了。说明一个人独自走是可能会走重复路的,vis肯定就要开3维。结构体中f == 1代表都没到,f == 0有一个人到了,f状态改变后,vis[][][f]也刷新了,自然就可以走回头路了。
//
代码细节:
1:注意我存图是从下标0开始的,st_x,st_y要--“debug找半天”。
2:if(t == 1 || t == 2),其中一个人到了,那么就把没到的人的坐标赋值给x1,y1,后续处理边界什么的只考虑x1,y1就行了。
//
题解:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e3+9;
int n,m,st_x,st_y;
char mp[N][N];
int vis[N][N][2];
int dx1[]={-1,1,0,0};
int dy1[]={0,0,-1,1};
int dx2[]={1,-1,0,0};
int dy2[]={0,0,1,-1};

struct Nod{
    int x1,y1,x2,y2,f,step;
}temp,p;
queue<Nod>q;

void bfs(){
    q.push({st_x,st_y,st_x,st_y,1,0});
    while(!q.empty()){
      temp=q.front();q.pop();
      if(vis[temp.x1][temp.y1][temp.f]){ continue;}
        vis[temp.x1][temp.y1][temp.f]=1;

      if(temp.f){//两个都没到
          for(int i=0;i<4;i++){
            p.x1=temp.x1+dx1[i];
            p.y1=temp.y1+dy1[i];
            p.step=temp.step+1;
            p.x2=temp.x2+dx2[i];
            p.y2=temp.y2+dy2[i];
            p.f=temp.f;
            if(p.x1>=0&&p.x1<n&&p.x2>=0&&p.x2<n && p.y1>=0&&p.y1<m&&p.y2>=0&&p.y2<m && mp[p.x1][p.y1]!='#'&&mp[p.x2][p.y2]!='#'&&!vis[p.x1][p.y1][p.f]){
                int t=0;
                if(mp[p.x1][p.y1]=='@'){t+=1;}
                if(mp[p.x2][p.y2]=='@'){t+=2;}
                if(t==0){q.push(p);}//都没到
                if(t==1){q.push({p.x2,p.y2,p.x1,p.y1,0,p.step});}//1到了
                if(t==2){q.push({p.x1,p.y1,p.x2,p.y2,0,p.step});}//2到了
                if(t==3){cout<<p.step<<endl;return;}//都到了
            }
          }
      }
      else{//其中一个到了
          for(int i=0;i<4;i++){
              p.x1=temp.x1+dx1[i];
              p.y1=temp.y1+dy1[i];
              p.step=temp.step+1;
              p.f=temp.f;
              if(p.x1>=0&&p.x1<n && p.y1>=0&&p.y1<m && mp[p.x1][p.y1]!='#'&&!vis[p.x1][p.y1][p.f]){
                  if(mp[p.x1][p.y1]=='@'){
                      cout<<p.step<<endl;return;
                  }
                  if(mp[p.x1][p.y1]=='.'){
                      q.push(p);
                  }
              }
          }
      }
    }
    cout<<"-1"<<endl;
}

int main()
{
   cin>>n>>m>>st_x>>st_y;
   st_x-=1,st_y-=1;//mp是从0开始存的
   for(int i=0;i<n;i++){
       for(int j=0;j<m;j++){
           cin>>mp[i][j];
       }
   }

   bfs();
    return 0;
}

标签:AC,temp,vis,int,ACM,st,牛客,y1,x1
From: https://www.cnblogs.com/yongchaoD/p/18401455

相关文章

  • 开源项目FaceFusion-AI换脸
    FaceFusion简介录制了一个简短的说明facefusion开源项目-视频换脸FaceFusion是一个开源的AI换脸和增强工具,支持图像和视频处理。它采用最新的深度学习技术,提供了一系列强大的功能,包括人脸替换、人脸增强、唇形同步等。FaceFusion的目标是为用户提供一个易用、高效且......
  • ffmpeg(各个系统版本安装- Windows11-Mac-Linux)
    各个系统上的安装不建议使用编译安装,大佬的话可以编译安装会各种环境问题,直接使用别人安装好的就行1.Windows11上安装ffmpeg1.官网下载ffmpeg进入DownloadFFmpeg网址,点击下载windows版ffmpeg,使用别人编译好的版本即可在releasebuilds里面选择一个版本(使用release......
  • 洛谷P3128 [USACO15DEC] Max Flow P && 树上差分
    传送门:P3128[USACO15DEC]MaxFlowP首先要学会差分qwq题目意思:给定一个节点数为\(n\)的树,有\(m\)次操作。每次操作给你两个数\(s\)和\(t\),你需要在\(s\)到\(t\)的路径所经过点的运输压力\(+1\)。求最后运输压力最大的点的压力。思路:发现\(s\)到\(t\)的路......
  • PARTII-Oracle数据访问-SQL
    7.SQL7.1.SQL简介7.1.1.SQL数据访问7.1.2.SQL标准7.2.SQL语句概述7.2.1.数据定义语言(DDL)7.2.2.数据操作语言(DML)7.2.3.事务控制语句7.2.4.会话控制语句7.2.5.7.3.优化器概述7.3.1.优化器用途7.3.2.优化器的组件7.3.3.访问路径7.3.4.优化器统计信息7.3......
  • openstack的主要功能组件
    1:简介主要分为5个不同的层次16个不同功能模块:Presentation【表示层】:api模块,ui模块Logic(Control)【逻辑控制层】:Orchostration【编排服务】,Scheduling【调度服务】,Policy【策略服务】,ImageRegistry【镜像注册服务】,Logging【日志服务】Resource【资源管理层】:Compute【计......
  • PART1-Oracle关系数据结构-数据字典与动态性能视图
    6.数据字典与动态性能视图6.1.数据字典概述Oracle数据库的一个重要组成部分是其数据字典,这是一个只读的表集合,提供了有关数据库的管理元数据。数据字典包含如下信息:数据库中每个模式对象的定义,包括列的默认值和完整性约束信息分配给模式对象的空间量以及当前使用的量Oracl......
  • Distributed Training: DeepSpeed ZeRO 1/2/3 + Accelerate, Megatron-LM
    1IntroductionGithub:https://github.com/microsoft/DeepSpeedZeRO:MemoryOptimizationsTowardTrainingTrillionParameterModelsZeRO-Offload:DemocratizingBillion-ScaleModelTrainingZeRO-Infinity:BreakingtheGPUMemoryWallforExtremeScaleDee......
  • 如何在Java中获取Windows和Linux/Mac系统上的桌面路径
    在Java中,你可以使用System.getenv()方法来获取环境变量。对于获取桌面路径,你可以根据操作系统的不同来获取相应的环境变量。对于Windows系统,你可以尝试获取USERPROFILE环境变量,它通常指向当前用户的主目录,而Windows的桌面通常位于此目录下的Desktop文件夹内。对于Linux和Mac系统......
  • Oracle 19c数据库:Windows详细安装与配置指南
    Oracle19c的安装和配置是一个相对复杂但系统化的过程,本文演示如何在Windows系统下安装Oracle数据库,安装足够的磁盘空间(一般需要5~6个G,所以选剩余空间大的盘)。以下是一个详细的步骤指南,包括准备工作、安装过程、配置监听器和数据库测试等关键步骤:一、下载Oracle19c安装包访问Or......
  • Android 开发避坑经验(2):深入理解Fragment与Activity交互
    在Android开发过程中,Fragment和Activity之间的交互是一个常见的难题,处理不当会引发UI更新问题、生命周期混乱、数据丢失等问题。这篇文章将深入探讨如何避免这些常见坑点,提供可靠的解决方案,并通过示例代码展示最佳实践。1.坑点:Fragment和Activity的生命周期差异......