Toyota Programming Contest 2023#4(AtCoder Beginner Contest 311)D题题解

文章目录

  • [Grid Ice Floor](https://atcoder.jp/contests/abc311/tasks/abc311_d)
    • 问题建模
    • 问题分析
      • 1.分析移动时前后两个点之间的联系
      • 2.方法1通过BFS将所有按照给定运动方式可以到达的点都标记
        • 代码
      • 3.方法2采用DFS来标记路径上的点的运动状态
        • 代码

Grid Ice Floor

在这里插入图片描述在这里插入图片描述

问题建模

给定一个n*m的字符矩阵有’.‘和’#‘两种字符,其中’.'为冰块是可移动的到的地方,‘#'为岩石无法移动到该地方。从点(2,2)出发,出发时选择一个方向移动,持续移动至撞上岩石时停止,并重新选择移动方向。问由点(2,2)出发最多可以经过的冰块数量为多少。

问题分析

1.分析移动时前后两个点之间的联系

若前一个点是由停止后,选择新的移动方向进行移动,则后一个点为保持前一个点的移动方向进行移动。若前一个点是移动的,则到后一个点既有可能保持与前一个点同样的移动方向继续移动,也有可能是无法移动从而停止。通过分析两点间的联系,可以发现每个点的状态有2大类,一类为停止,一类为运动,运动里有按运动方向分为上下左右四种。

2.方法1通过BFS将所有按照给定运动方式可以到达的点都标记

因为任意一个点只要有一种运动状态被标记,则该点一定可以由(2,2)点到达,那我们可以让(2,2)为起点跑BFS将所有可以可到达路径上的点都标记,最终统计所有被标记过的点即可得到答案。

代码

#include<bits/stdc++.h>#define x first
#define y second
#define C(i) str[0][i]!=str[1][i]
using namespace std;
typedef unsigned long long ULL;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
const int N =210, Mod =998244353;
int n,m;
string g[N];
bool st[N][N][5];///记录该点的5种状态
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};void  bfs(){memset(st,false,sizeof(st));st[1][1][4]=true;queue<int> q;///将坐标信息和状态映射为一个整数并出入队列中q.push(5*(m+1)+4);while(q.size()){int qt=q.front();q.pop();int x=(qt/5)/m;int y=(qt/5)%m;int d=qt%5;if(d==4){///若当前状态为停止,则选择新的方向移动for(int i=0;i<4;i++){int nx=x+dx[i],ny=y+dy[i];if(nx>0&&nx<n-1&&ny>0&&ny<m-1&&g[nx][ny]!='#'&&!st[nx][ny][i]){st[nx][ny][i]=true;q.push(5*(m*nx+ny)+i);}}}else {int nx=x+dx[d],ny=y+dy[d];///若当前运动方向可以接着移动,则继续移动,否则停止,并选择新的方向if(nx>0&&nx<n-1&&ny>0&&ny<m-1&&g[nx][ny]!='#'&&!st[nx][ny][d]){st[nx][ny][d]=true;q.push(5*(m*nx+ny)+d);}else {if(!st[x][y][4]){st[x][y][4]=true;q.push(5*(m*x+y)+4);}}}}
}void solve() {cin >>n >>m;for(int i=0;i<n;i++)    cin >>g[i];bfs();int cnt=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){///若该点有一种状态被标记,则该点可达cnt+=(st[i][j][0]|st[i][j][1]|st[i][j][2]|st[i][j][3]|st[i][j][4]);}}cout <<cnt<<endl;
}  int main() {int t = 1;//cin >> t;while (t--) solve();return 0;
}

3.方法2采用DFS来标记路径上的点的运动状态

代码

停止后再选择新的移动方向可以不用设置为一个单独的状态,而是直接选择新的方向,从而省去停止状态

#include<bits/stdc++.h>#define x first
#define y second
#define C(i) str[0][i]!=str[1][i]
using namespace std;
typedef unsigned long long ULL;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
const int N =210, Mod =998244353;
int n,m;
string g[N];
bool st[N][N][4];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};void dfs(int x,int y,int d){if(g[x][y]=='#'||st[x][y][d])    return ;st[x][y][d]=true;int nx=x+dx[d],ny=y+dy[d];if(g[nx][ny]!='#'){///可以继续移动dfs(nx,ny,d);}else{//更换方向for(int i=0;i<4;i++){nx=x+dx[i],ny=y+dy[i];dfs(nx,ny,i);}}
}void solve() {cin >>n >>m;for(int i=0;i<n;i++)    cin >>g[i];memset(st,false,sizeof(st));dfs(1,1,3);int cnt=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){cnt+=(st[i][j][0]|st[i][j][1]|st[i][j][2]|st[i][j][3]);}}cout <<cnt<<endl;
}  int main() {int t = 1;//cin >> t;while (t--) solve();return 0;
}

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

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

相关文章

测试岗?从功能测试进阶自动化测试开发,测试之路不迷茫...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 测试新人在想什么…

IO进程线程day7(2023.8.4)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;创建两个线程&#xff1a;其中一个线程拷贝前半部分&#xff0c;另一个线程拷贝后半部分。 只允许开一份资源&#xff0c;且用互斥锁方式实现。 提示&#xff1a;找临界区--->找临界资源。 #includ…

swagger相关问题

swagger相关问题 swagger版本为&#xff1a; <dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.9.6</version> </dependency> <dependency><groupId&…

网络安全设备-等保一体机

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 等保一体机的功能 等保一体机产品主要依赖于其丰富的安全网元&#xff08;安全网元包括&#xff1a;防火…

sentinel组件

目录 定义 4.加SentinelResource,blockHander是超过阈值之后执行的函数 5.设置阈值 6.springboot集成sentinel 定义 1.sentinel知道当前流量大小&#xff0c;在浏览器和后端之间加sentinel控制流量&#xff0c;避免大批量的瞬时请求都达到服务上&#xff0c;将服务压垮 2.…

汉字姓名转拼音

import osimport pandas as pdfrom xpinyin import Pinyindownpath/Users/Kangyongqing/Downloads/ file1教师姓名转拼音.xlsxdtpd.read_excel(downpathfile1) print(dt.info()) dt[pinyin]dt[教师姓名].apply(lambda x:Pinyin().get_pinyin(x).split(-)[0].capitalize() .join…

linux的搭建以及网关配置

Linux 目前国内 Linux 更多的是应用于服务器上,而桌面操作系统更多使用的是 Windows 安装linux虚拟机 网址 VMware下载网址 点击Workstation 16 Pro for Windows下载 安装CentOS centO下载网址 依次点击 7.6.1810/ isos/ x86_64/ CentOS-7-x86_64-DVD-1810.…

Vue3 watch监听器

概览&#xff1a;watch监听器的定义以及使用场景。在vue3中的监听器的使用方式&#xff0c;watch的三个参数&#xff0c;以及进一步了解第一个参数可以是一个属性&#xff0c;也可以是一个数组的形式包含多个属性。 watch在vue3和vue2中的使用&#xff1a; vue3中&#xff1a…

uniapp-疫情应急管理系统学生端

1 疫情资讯展示 <template><view class"container"><uni-section title"自定义卡片内容" type"line"><uni-card title"基础卡片" class"card-box" v-for"(item,index) in epidemicNewsList"…

【MySQL】DQL语句

8&#xff0c;DQL 下面是黑马程序员展示试题库数据的页面 页面上展示的数据肯定是在数据库中的试题库表中进行存储&#xff0c;而我们需要将数据库中的数据查询出来并展示在页面给用户看。上图中的是最基本的查询效果&#xff0c;那么数据库其实是很多的&#xff0c;不可能在将…

Codeforces Round 881 (Div. 3)F1题解

文章目录 [Omsk Metro (simple version)](https://codeforces.com/contest/1843/problem/F1)问题分析1.分析如何知道根节点到某个结点的区间内是否存在一个子段和为k2.方法1使用树形DP来动态维护每个节点到根节点的最大子段和和最小子段和代码 Omsk Metro (simple version) 问题…

STM32使用HAL库中外设初始化MSP回调机制及中断回调机制详解

STM32使用HAL库之Msp回调函数 1.问题提出 在STM32的HAL库使用中&#xff0c;会发现库函数大都被设计成了一对&#xff1a; HAL_PPP/PPPP_Init HAL_PPP/PPPP_MspInit 而且HAL_PPP/PPPP_MspInit函数的defination前面还会有__weak关键字 上面的PPP/PPPP代表常见外设的名称为…

【css】使用float实现水平导航栏

该实例使用float 浮动实现元素浮动在水平方向&#xff0c;从而实现水平导航栏效果。 overflow: hidden&#xff1a;当不给父级元素设置高度的时候&#xff0c;其内部元素浮动后会导致下面的元素顶上去&#xff0c;这是因为子元素浮动后&#xff0c;子元素脱离标准流&#xff0…

组合总和——力扣39

文章目录 题目描述回溯 题目描述 回溯 class Solution { public:vector<vector<int>> res;vector<int> seq; void dfs(vector<int>& nums, int pos, int target){if(target0){res.emplace_back(seq);return;}if(posnums.size()){return;}//直接跳过…

uniapp 使用iconfont

问题描述&#xff1a;在开发过程中会遇到使用自定义icon的情况&#xff0c;在uniapp项目中使用iconfont步骤如下。 问题解决 步骤一&#xff1a; 打开iconfont网址------我的项目-----下载至本地 下载成功的文件内容&#xff1a; 步骤二&#xff1a; 以管理员身份运行终端&am…

Linux的基本指令(2)

指令1&#xff1a;man 作用&#xff1a;可以查询linux指令语法内容。 格式&#xff1a; man 指令 安装man指令&#xff1a; yum install -y man-pages 例如&#xff1a; 查询 指令 ls 的语法内容。 man ls 查询 fork 指令的语法内容。 man fork 在man中存在9个手册&…

【云原生】深入掌握k8s中Pod和生命周期

个人主页&#xff1a;征服bug-CSDN博客 kubernetes专栏&#xff1a;kubernetes_征服bug的博客-CSDN博客 目录 1 什么是 Pod 2 Pod 基本操作 3 Pod 运行多个容器 4 Pod 的 Labels(标签) 5 Pod 的生命周期 1 什么是 Pod 摘取官网: Pod | Kubernetes 1.1 简介 Pod 是可以在 …

idea打开传统eclipse项目

打开传统web项目 1.打开后选择项目文件 2.选择项目结构 3.设置jdk版本 4.导入当前项目模块 5.选择eclipse 6. 设置保存目录 7.右键模块&#xff0c;添加spring和web文件 8. 设置web目录之类的&#xff0c;并且创建打包工具 9.如果有本地lib&#xff0c;添加为库 最后点击应用&…

Databend 开源周报第 104 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 从 Kafka 载入数…

安装win版本的neo4j(2023最新版本)

安装win版本的neo4j 写在最前面安装 win版本的neo4j1. 安装JDK2.下载配置环境变量&#xff08;也可选择直接点击快捷方式&#xff0c;就可以不用配环境了&#xff09;3. 启动neo4j 测试代码遇到的问题及解决&#xff08;每次环境都太离谱了&#xff0c;各种问题&#xff09;连接…