题解:ABC276E - Round Trip

题解:ABC276E - Round Trip

·题目

链接:Atcoder。

链接:洛谷。

·难度

算法难度:普及。

思维难度:提高。

调码难度:提高。

综合评价:困难。

·算法

bfs。

·思路

从起点周围四个点中任选两个可以走的(记为点1、点2),判断他们两个在不经过起点的情况下是否连通(当然是用bfs判断),由于该两个点之间路径长度至少为2(见图1),所以该回路总长度一定不少于4(起点—{1}—点1—{不少于2}—点2—{1}—起点)。因此,只要有任意两个点可以并经过起点并且互相联通,就应该输出Yes,否则输出No。

 

·代价

O(N+M)。

·细节

由于数据大小不确定,对于存储问题可以用vector、string、map等实现。

·代码

#include<bits/stdc++.h>
#define N 1100000
using namespace std;
struct Node{int d,x,y;
};
map<pair<int,int>,bool>see;
string mp[N]={};
Node q[N]={};
int c[4][2]={{-1,0},{0,-1},{0,1},{1,0}},h=0,w=0,x=0,y=0;
char in[N]={};
bool can_get(int ax,int ay,int bx,int by);
int main(){scanf("%d%d",&h,&w);for(int i=1;i<=h;i++){scanf("%s",in);mp[i]=in;}for(int i=1;i<=h;i++){mp[i]=' '+mp[i];for(int j=1;j<=w;j++){if(mp[i][j]=='S'){x=i;y=j;}}}for(int i=0;i<4;i++){for(int j=i+1;j<4;j++){int ax=x+c[i][0],ay=y+c[i][1],bx=x+c[j][0],by=y+c[j][1];if(mp[ax][ay]!='#'&&mp[bx][by]!='#'){if(can_get(ax,ay,bx,by)==true){printf("Yes\n");return 0;}}}}printf("No\n");return 0;
}
bool can_get(int ax,int ay,int bx,int by){see.clear();int front=1,rear=0;rear++;q[rear]={0,ax,ay};see[{ax,ay}]=true;while(front<=rear){Node now=q[front];if(now.x==bx&&now.y==by){return true;}for(int i=0;i<4;i++){int nx=now.x+c[i][0],ny=now.y+c[i][1];if(see[{nx,ny}]==true||nx<1||ny<1||nx>h||ny>w||nx==x&&ny==y||mp[nx][ny]=='#'){continue;}else{see[{nx,ny}]=true;rear++;q[rear]={now.d+1,nx,ny};}}front++;}return false;
}

·注意

bfs内移动时要考虑边界、障碍物、是否在起点等问题;输出Yes后一定要及时退出程序;string存储时一定要注意是从0还是1开始。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/63293.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【脚踢数据结构】深入理解栈

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言,Linux基础,ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的一句鸡汤&#x1f914;&…

2023牛客暑期多校训练营7(C/I/M)

目录 C.Beautiful Sequence I.We Love Strings M.Writing Books C.Beautiful Sequence 思路&#xff1a;显然若得到了a[1]&#xff0c;则整个序列a我们都知道了。所以我们要求出第k大的a[1]&#xff0c;这个可以利用序列a为不递减序列的性质来得出。 首先&#xff0c;由题…

LVGL学习笔记 28 - 键盘keyboard

目录 1. 设置关联文本框 2. 设置模式 2.1 LV_KEYBOARD_MODE_TEXT_LOWER 2.2 LV_KEYBOARD_MODE_TEXT_UPPER 2.3 LV_KEYBOARD_MODE_SPECIAL 2.4 LV_KEYBOARD_MODE_NUMBER 2.5 LV_KEYBOARD_MODE_USER_1 ~ LV_KEYBOARD_MODE_USER_4 3. 使能弹窗模式 4. 更改按键布局 5. 事…

【el-image图片查看时 样式穿透表格问题】

element-ui el-image图片查看 样式混乱 解决方式 ::v-deep(.el-table__cell) {position: static !important; // 解决el-image 和 el-table冲突层级冲突问题 }加个样式即可

JavaScript、TypeScript、ES5、ES6之间的联系和区别

ECMAScript&#xff1a; 一个由 ECMA International 进行标准化&#xff0c;TC39 委员会进行监督的语言。通常用于指代标准本身。JavaScript&#xff1a; ECMAScript 标准的各种实现的最常用称呼。这个术语并不局限于某个特定版本的 ECMAScript 规范&#xff0c;并且可能被用于…

大数据扫盲(1): 数据仓库与ETL的关系及ETL工具推荐

在数字化时代&#xff0c;数据成为了企业决策的关键支持。然而&#xff0c;随着数据不断增长&#xff0c;有效地管理和利用这些数据变得至关重要。数据仓库和ETL工具作为数据管理和分析的核心&#xff0c;将帮助企业从庞杂的数据中提取有价值信息。 一、ETL是什么&#xff1f; …

Java的switch语句块

说明 Java的switch语句块可以用于多个分支的判断执行。每个case分支执行完后&#xff0c;要么退出方法体&#xff08;用return语句&#xff09;、要么退出switch语句块&#xff08;用break语句&#xff09;、要么继续往下执行。但如果一个case执行完后&#xff0c;要继续执行下…

在 Android 上使用机器学习套件检测人脸

须知事项 此 API 需要 Android API 级别 19 或更高级别。确保应用的 build 文件使用的 minSdkVersion 值不小于 19。 请务必在您的项目级 build.gradle 文件中的 buildscript 和 allprojects 部分添加 Google 的 Maven 代码库。 将 Android 版机器学习套件库的依赖项添加到模…

Linux平台下搭建GB28181服务器(WVP+ZLMediakit)

文章目录 什么是GB28181平台依赖项搭建步骤配置Redis和MySQL配置ZLMediakit配置WVP 使用效果封装成Docker镜像 什么是GB28181 GB28181(国标28181)&#xff0c;全称为《中华人民共和国公共安全视频监控联网系统技术要求》&#xff0c;是中国国家标准委员会发布的一个针对公共安…

springboot+mybatis+mybatis-plus对crud项目进行改进

springbootmybatis实现简单的增、删、查、改https://blog.csdn.net/heyl163_/article/details/132197201上一篇文章&#xff0c;已经详细地介绍了怎么通过springboot项目整合mybatis实现简单的数据库表的增删改查功能&#xff0c;是最简单的springboot项目的结构。所以有很多问…

易服客工作室:如何在WordPress网站中举办虚拟活动

您是否正在寻找举办和管理虚拟活动的最佳方式&#xff1f; 也许您想在线举行下一次会议或举办有关您的产品和服务的网络研讨会。您可能担心它太贵&#xff0c;或者您没有技术知识来实现​​它。 在本文中&#xff0c;我们将列出您所需的在线服务的所有设备&#xff0c;并教您…

【vue3】基础知识点-setup语法糖

学习vue3&#xff0c;都会从基础知识点学起。了解setup函数&#xff0c;ref&#xff0c;recative&#xff0c;watch、comptued、pinia等如何使用 今天说vue3组合式api&#xff0c;setup函数 在学习过程中一开始接触到的是这样的&#xff0c;定义数据且都要通过return返回 <…