Atcoder ABC339 D - Synchronized Players

Synchronized Players(同步的球员)

时间限制:4s 内存限制:1024MB

【原题地址】

所有图片源自Atcoder,题目译文源自脚本Atcoder Better!

点击此处跳转至原题

【问题描述】

在这里插入图片描述

【输入格式】

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

【输出格式】

在这里插入图片描述

【样例1】

【样例输入1】

5
....#
#..#.
.P...
..P..
....#

【样例输出1】

3

【样例说明1】

在这里插入图片描述

【样例2】

【样例输入2】

2
P#
#P

【样例输出2】

-1

【样例3】

【样例输入3】

10
..........
..........
..........
..........
....P.....
.....P....
..........
..........
..........
..........

【样例输出3】

10

【解题思路】

老汉使用到的是BFS的解题方式

本题是求两点重合的最小操作数,不能重合则输出 -1 。
设两点坐标分别为 ( i1 , j1 ) 、( i2 , j2 ),将这两个坐标用四个维度的 ( i1 , j1 , i2 , j2 ) 坐标来表示,当 i1 = i2 , j1 = j2 时,才是答案所要求的情况,初始时两点错开,只有利用好棋子遇到障碍物和边界无法继续移动的特性,才能达成目的,用 BFS 搜索最短路径,并且枚举出遇到边界和障碍物的情况下坐标的变化,最早遇到重合的情况就是答案,如果遍历了整个过程下来依然没有获取到答案,则输出 -1 。

代码注释有详细过程

【代码】

package ABC339_D_SynchronizedPlayers;import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class Main {// x、y坐标移动方向int[] dx = { 1, 0, -1, 0 };int[] dy = { 0, 1, 0, -1 };public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt();// 存放对应位置摆放情况char[][] cs = new char[n][n];for (int i = 0; i < n; i++) {cs[i] = scan.next().toCharArray();}// 头结点,用于bfs起始点Coord cod = new Coord();// 判断当前位置是否被遍历boolean[][][][] blank = new boolean[n][n][n][n];// 初始化codboolean bool = true;cod.res = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (cs[i][j] == 'P') {if (bool) {cod.x1 = i;cod.y1 = j;bool = false;} else {cod.x2 = i;cod.y2 = j;break;}}}}Queue<Coord> q = new LinkedList<Coord>();// 将起始点加入队列q.add(cod);Main mi = new Main();mi.bfs(q, blank, cs);scan.close();}// bfs遍历求最小操作数public void bfs(Queue<Coord> q, boolean[][][][] blank, char[][] cs) {// 存放边界nint n = blank.length;int ans = -1;while (!q.isEmpty()) {Coord cod = q.poll();// 当符合答案要求时,输出结果if (cod.x1 == cod.x2 && cod.y1 == cod.y2) {ans = cod.res;break;}for (int i = 0; i < 4; i++) {// 计算正常情况的下一坐标int xa = cod.x1 + dx[i], xb = cod.x2 + dx[i];int ya = cod.y1 + dy[i], yb = cod.y2 + dy[i];Coord coord = new Coord();// 操作步数等于上一步数加一coord.res = cod.res + 1;// 判断1点坐标变化// 未遇到边界或障碍时坐标正常更新,否则不变if (xa >= 0 && xa < n && ya >= 0 && ya < n && cs[xa][ya] != '#') {coord.x1 = xa;coord.y1 = ya;} else {coord.x1 = cod.x1;coord.y1 = cod.y1;}// 判断2点坐标变化// 未遇到边界或障碍时坐标正常更新,否则不变if (xb >= 0 && xb < n && yb >= 0 && yb < n && cs[xb][yb] != '#') {coord.x2 = xb;coord.y2 = yb;} else {coord.x2 = cod.x2;coord.y2 = cod.y2;}// 当下一点为空格时,添加进队列if (!blank[coord.x1][coord.y1][coord.x2][coord.y2]) {q.add(coord);// 标记为被访问blank[coord.x1][coord.y1][coord.x2][coord.y2] = true;}}}System.out.println(ans);}
}class Coord {int x1, y1, x2, y2, res;public Coord() {}
}

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

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

相关文章

Python算法100例-1.6 打鱼还是晒网

1.问题描述2.问题分析3.算法设计4.确定程序框架5.求出指定日期距离1990年1月1日的天数6.完整的程序7.补充知识点 1&#xff0e;问题描述 中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起便开始“三天打鱼两天晒网”&#xff0c;问这个人在以后的某一天中是“打鱼”…

【AIGC】Stable Diffusion的常见错误

Stable Diffusion 在使用过程中可能会遇到各种各样的错误。以下是一些常见的错误以及可能的解决方案&#xff1a; 模型加载错误&#xff1a;可能出现模型文件损坏或缺失的情况。解决方案包括重新下载模型文件&#xff0c;确保文件完整并放置在正确的位置。 依赖项错误&#x…

Write operation failed: computed value is readonly问题解决

源代码&#xff1a; // 封装倒计时逻辑函数 import { computed, ref } from vue import dayjs from dayjs export const useCountDown () > {// 1.响应式数据const time ref(0)// 格式化时间const formatTime computed(()>dayjs.unix(time.value).format(mm分ss秒))/…

QPaint绘制自定义坐标轴组件00

最终效果 1.创建一个ui页面,修改背景颜色 鼠标右键->改变样式表->添加颜色->background-color->选择合适的颜色->ok->Apply->ok 重新运行就可以看到widget的背景颜色已经改好 2.创建一个自定义的widget窗口小部件类,class MyChart : public QWidget m…

Python算法题集_二叉树的层序遍历

Python算法题集_二叉树的层序遍历 题102&#xff1a;二叉树的层序遍历1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【DFS递归】2) 改进版一【BFS迭代】3) 改进版二【BFS迭代循环】 4. 最优算法 本文为Python算法题集之一的代码示例 题102&am…

我的NPI项目之嵌入式总线系列(一) -- SPI 总线

SPI总线很有意思&#xff0c; 如我的NPI项目之Android 安全系列 -- 外挂SE集成&#xff08;SPI&#xff09;接口-CSDN博客 提到SPI的接口&#xff0c;基本的电气特性已经给出。这边文章就针对协议部分进行详细解析。从协议网找到了原文&#xff1a;SPI protocol 还有wilipedi…

(五)【Jmeter】使用代理录制HTTP脚本操作步骤及注意事项

前置信息 软件版本Jmeter5.6.3服务网址备注drupalhttp://192.168.88.88:18080/(二)【Jmeter】专栏实战项目靶场drupal部署 用户名密码test1test1test2test2实操记录 1、启动jmeter,操作顺序见下图 2、在视图面板添加如下信息,点击开始

请标记你的龙年心愿关键词

昨天外孙陪我游了崇州市白头镇、道民镇&#xff08;竹艺村&#xff09;&#xff0c;见我心情愉悦&#xff0c;今天再陪我去饱览其他风景名胜&#xff0c;所以笔者——本“人民体验官”特别推广人民日报官方微博文化产品《2024年第一批春花开了》《#大年初七#&#xff0c;标记你…

【Linux取经路】文件系统之被打开的文件——文件描述符的引入

文章目录 一、明确基本共识二、C语言文件接口回顾2.1 文件的打开操作2.2 文件的读取写入操作2.3 三个标准输入输出流 三、文件有关的系统调用3.1 open3.1.1 比特位级别的标志位传递方式 3.2 write3.2.1 模拟实现 w 选项3.2.2 模拟实现 a 选项 3.3 read 四、访问文件的本质4.1 再…

ArduPilot开源飞控之硬件SBC分析

ArduPilot开源飞控之硬件SBC分析 1. 源由2. Companion Computer2.1 APSync【不推荐&#xff0c;无更新】2.2 DroneKit【不推荐&#xff0c;无更新/SDK】2.3 FlytOS【不推荐&#xff0c;闭源】2.4 Maverick【不推荐&#xff0c;闭源】2.5 ROS【专门讨论&#xff0c;开源/复杂】2…

保育员线上考试答案查找?分享8个有手机就能搜题的工具 #经验分享#其他

市面上搜题软件不少&#xff0c;大部分都挺好用的&#xff0c;今天小编在这里给大家分享几个好用的搜题工具&#xff0c;都拥有丰富的题库资源&#xff1b;而且搜题功能也都很完善&#xff0c;手机端、网页端均有&#xff0c;有需要的小伙伴赶紧码住&#xff01; 1.题老大 这…

Rust 数据结构与算法:4栈:用栈实现进制转换

2、进展转换 将十进制数转换为二进制表示形式的最简单方法是“除二法”&#xff0c;可用栈来跟踪二进制结果。 除二法 下面实现一个将十进制数转换为二进制或十六进制的算法&#xff0c;代码如下&#xff1a; #[derive(Debug)] struct Stack<T> {size: usize, // 栈大…