I’m stuck!(CCF201312-5)解析(java实现)

在这里插入图片描述

代码

package test_201312;import java.util.Scanner;/** 201312-5
试题名称:	I’m stuck!
时间限制:	1.0s
内存限制:	256.0MB
问题描述:	
问题描述给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思:'#': 任何时候玩家都不能移动到此方格;'+': 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;'-': 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非'#'方格移动一格;'|': 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非'#'方格移动一格;'.': 当玩家到达这一方格后,下一步只能向下移动一格。如果下面相邻的方格为'#',则玩家不能再移动;'S': 玩家的初始位置,地图中只会有一个初始位置。玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;'T': 玩家的目标位置,地图中只会有一个目标位置。玩家到达这一方格后,可以选择完成任务,也可以选择不完成任务继续移动。如果继续移动下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格。此外,玩家不能移动出地图。请找出满足下面两个性质的方格个数:1. 玩家可以从初始位置移动到此方格;2. 玩家不可以从此方格移动到目标位置。
输入格式输入的第一行包括两个整数R 和C,分别表示地图的行和列数。(1 ≤ R, C ≤ 50)。接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个'S'和一个'T'。
输出格式如果玩家在初始位置就已经不能到达终点了,就输出“I'm stuck!”(不含双引号)。否则的话,输出满足性质的方格的个数。
样例输入
5 5
--+-+
..|#.
..|##
S-+-T
####.
样例输出
2
样例说明如果把满足性质的方格在地图上用'X'标记出来的话,地图如下所示:
--+-+
..|#X
..|##
S-+-T
####X*/
public class Main5 {// 代表输入的字符static char map[][];// 偏移量,上、右、下、左static int[] dx = { -1, 0, 1, 0 };static int[] dy = { 0, 1, 0, -1 };// 从起点能够到达的点的标识static boolean[][] vis1;// 能够到达终点的点的标识static boolean[][] vis2;public static void main(String[] args) {Scanner input = new Scanner(System.in);int R = input.nextInt();int C = input.nextInt();map = new char[R][C];vis1 = new boolean[R][C];vis2 = new boolean[R][C];int S_i = 0, S_j = 0, T_i = 0, T_j = 0;for (int i = 0; i < R; i++) {String strline = input.next();// 获取一行字符串for (int j = 0; j < C; j++) {map[i][j] = strline.charAt(j);// 获取对应的字符,并获得S和T的位置if (map[i][j] == 'S') {S_i = i;S_j = j;} else if (map[i][j] == 'T') {T_i = i;T_j = j;}}}input.close();dfs1(S_i, S_j);dfs2(T_i, T_j);// 如果起点无法到终点if (!vis1[T_i][T_j]) {System.out.println("I'm stuck!");} else {// 统计能够从起点到该点且从该点也可以到终点的格子数量int res = 0;for (int i = 0; i < R; i++) {for (int j = 0; j < C; j++) {if (vis1[i][j] && !vis2[i][j]) {res++;}}}System.out.println(res);}}// 标记起点能够到达的节点private static void dfs1(int x, int y) {vis1[x][y] = true;for (int i = 0; i < 4; i++) {int r = x + dx[i];int c = y + dy[i];if (r < 0 || c < 0 || r >= map.length || c >= map[0].length || map[r][c] == '#' || vis1[r][c]) {continue;}// 判断从(x,y)是否能够到达(r,c),若不能到达,则递归结束if (check(x, y, i)) {dfs1(r, c);}}}/*** 检测从(x,y)是否能够移动到(r,c),(r,c)由i索引的dx、dy定位* * @param x* @param y* @param i* @return*/private static boolean check(int x, int y, int i) {char c = map[x][y];if (c == 'S' || c == 'T' || c == '+') {return true;} else if (c == '|' && (i == 0 || i == 2)) {return true;} else if (c == '-' && (i == 1 || i == 3)) {return true;} else if (c == '.' && i == 2) {return true;} else {return false;}}/*** 标记终点能够到达的节点* * @param x* @param y*/private static void dfs2(int x, int y) {vis2[x][y] = true;for (int i = 0; i < 4; i++) {int r = x + dx[i];int c = y + dy[i];// 边界条件,以及判断是否已经访问过了if (r < 0 || c < 0 || r >= map.length || c >= map[0].length || map[r][c] == '#' || vis2[r][c]) {continue;}// 检测能否通过(r,c)到达(x,y),若不能到达,则递归结束if (check(r, c, i ^ 2)) {// 这里通过异或运算,得到的顺序和上面刚好相反,即上面是按照上、右、下、左顺序搜索,而这里就是下、左、上、右判断!dfs2(r, c);}}}}

代码分析

先初始化map二维数组,并得到S和T的位置。然后dfs1深搜从初始位置可以到达的全部方格;dfs2深搜可以移动到目标位置的全部方格。最后根据规则输出。
dfs1尝试上下左右四个方向,探索是否有移动可能。
1.先判断目标位置是否可以到达

 if (r < 0 || c < 0 || r >= map.length || c >= map[0].length || map[r][c] == '#' || vis1[r][c]) {continue;}

2.判断当前位置(x,y)是否可以进行i移动

if (check(x, y, i)) {dfs1(r, c);}

dfs2和dfs1功能相似。
dfs1考察从当前节点是否可以向四个方向移动,dfs2考察从四周是否可以到达当前节点。
dfs2
我们通过

   int r = x + dx[i];int c = y + dy[i];

获得四周节点,而check时需要检查,从四周节点是否可以到达当前节点,故第三个参数检查相反的移动方向是否可以。

  if (check(r, c, i ^ 2)) {// 这里通过异或运算,得到的顺序和上面刚好相反,即上面是按照上、右、下、左顺序搜索,而这里就是下、左、上、右判断!dfs2(r, c);}

本题只是使用了和图深度遍历同样的思想,并不是考察图结构的深度遍历。只是深度遍历二维数组。
一个基本模板如下:

import java.util.Random;public class TwoArrDfs {static Random random = new Random();private static void print(int[][] arrtwo) {for(int i = 0; i < arrtwo.length; i++){for(int j = 0; j < arrtwo[i].length; j++){System.out.print(arrtwo[i][j]+" ");}System.out.println();}}private static void dfs(int[][] arrtwo, int i, int j) {arrtwo[i][j] = random.nextInt(20)+1;//是否可以向上走if(i > 0 && arrtwo[i-1][j]==0){dfs(arrtwo, i-1, j);}//是否可以向下走if(i < arrtwo.length - 1 && arrtwo[i+1][j]==0){dfs(arrtwo, i+1, j);}//是否可以向左走if(j > 0 && arrtwo[i][j-1]==0){dfs(arrtwo, i, j-1);}//是否可以向右走if(j < arrtwo[0].length - 1 && arrtwo[i][j+1]==0){dfs(arrtwo, i, j+1);}}public static void main(String[] args) {int[][] arr = new int[4][5];dfs(arr,0,0);print(arr);}
}

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

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

相关文章

Oracle控制文件control file(1)控制文件概述

导读 本文介绍Oracle数据库控制文件control file相关内容 1、控制文件概述 控制文件是数据库中非常重要的一类文件&#xff0c;它记录的当前实例连接的数据库的结构和行为&#xff0c;并维护数据库的一致性。 初始化参数文件中定义了控制文件的位置&#xff1b; 控制文件是很…

抖音短视频小程序发布招聘让招聘更简单!

抖音短视频小程序怎么发布招聘信息呢&#xff1f; 据2023年初统计&#xff0c;全国已有人力资源机构6.3万家&#xff0c;其中在抖音短视频平台发布的人力资源公司有1.9万家以上&#xff0c;全国有近几千家大型企业已经通过抖音平台进行岗位直招。 抖音目前已经成为短视频流量…

2024年最佳硬盘!为台式电脑、NAS等产品量身定做的顶级机械硬盘

机械硬盘&#xff08;HDD&#xff09;可能看起来像是古老的技术&#xff0c;但它们仍然在许多地方提供“足够好”的性能&#xff0c;并且它们很容易以同等的价格提供最多的存储空间。 尽管最好的SSD将为你的操作系统和引导驱动器提供最好的体验&#xff0c;并提供比HDD更好的应…

vite项目修改依赖不更新,清除依赖缓存

有些时候我们会直接修改依赖文件&#xff0c;但修改后没有更新&#xff0c;大多数情况下就是被缓存了 解决方法 1、手动删除node_modules/.vite Vite 会将预构建的依赖缓存到 node_modules/.vite;然后手动删除即可 2、强制vite重新构建依赖 用 --force 命令行选项启动开发服务…

JavaScript this对象

this关键字时是函数运行时自动生成的一个内部对象&#xff0c;只能在函数内部使用&#xff0c;总指向调用它的对象 绑定规则 默认绑定 全局环境中定义函数&#xff0c;内部使用this关键字 var name Jenny; function person() {return this.name; } console.log(person());…

C++项目--高并发内存池

目录 一、项目介绍二、内存池介绍2.1 池化技术2.2 内存池2.3 内存池主要解决的问题2.4 malloc 三、定长内存池的实现3.1 定长内存池概念3.2 内存池管理释放对象3.3 内存池申请对象3.4 定长内存池整体代码3.5 性能对比 四、高并发内存池整体框架设计4.1 该项目解决的问题4.2 整体…

C语言贪吃蛇实现,以及一些有趣的想法(可加速减速)

文章目录 每日一言代码&#xff1a;Snake.hSnake.ctest.c 可以增加游戏趣味性的想法结语 每日一言 结局每隔一段时间就会到来&#xff0c;我经历它&#xff0c;就像飞机穿过云层。 跟着课程敲了一下午&#xff0c;终于写好了~ 用到了一些没用过的函数&#xff0c;总结介绍一下…

【Linux的网络编程】

1、OSI的七层网络模型有哪些&#xff0c;每一层有什么作用&#xff1f; 答&#xff1a;&#xff08;1&#xff09;应用层&#xff1a;负责处理不同应用程序之间的通信&#xff0c;需要满足提供的协议&#xff0c;确保数据发送方和接收方的正确。 &#xff08;2&#xff09;表…

【力扣100】70.爬楼梯 || python中的@cache || 装饰器

添加链接描述 思路&#xff1a; 最后一节楼梯的方式来自倒数第二节和倒数第三节的方法所以使用递归来做&#xff0c;定义递归出口n分别为1,2时候的方法种数&#xff1a;1种和2种类似于斐波那契数列超时了 优化&#xff1a; 5. 因为每次递归都要从n算到n为1和2的时候&#xff0…

安卓Java面试题 1-10

&#x1f525; 1、简述Android的4大组件是哪些&#xff0c;它们的作用&#xff1f;&#x1f525; Android的4大组件 1&#xff1a;Activity&#xff1a;Activity是Android程序与用户交互的窗口&#xff0c;是Android构造块中最基本的一种&#xff0c;它需要为保持各界面的状态…

Pytorch学习 day06(torchvision中的datasets、dataloader)

torchvision的datasets 使用torchvision提供的数据集API&#xff0c;比较方便&#xff0c;如果在pycharm中下载很慢&#xff0c;可以URL链接到迅雷中进行下载&#xff08;有些URL链接在源码里&#xff09;代码如下&#xff1a; import torchvision # 导入 torchvision 库 # …

VM 虚拟机 ubuntu 解决无法连接网络问题

添加网卡法 就是在虚拟机的设置那里多增加一个网卡

如何度量关键成果KR的完成情况?

明确度量指标 首先&#xff0c;需要为每一个关键成果&#xff08;Key Result&#xff09;设定明确的度量指标。这些指标应该是具体、可衡量的&#xff0c;以便能够清晰地反映关键成果的完成情况。例如&#xff0c;如果关键成果是提高网站的用户转化率&#xff0c;那么度量指标…

NOIP 2016普及组初赛试题及解析

NOIP 2016普及组初赛试题及解析 一. 单项选择题 (共20题,每题1.5分,共计30分。每题有且仅有一个正确答案.)。二. 问题求解(共2题,每题5分,共计10分)三. 阅读程序写结果(共4题,每题8分,共计32分)四. 完善程序 (前4空,每空2.5分,后6空,每空3分,共28分)一. 单项选…

论文阅读_解释大模型_语言模型表示空间和时间

英文名称: LANGUAGE MODELS REPRESENT SPACE AND TIME 中文名称: 语言模型表示空间和时间 链接: https://www.science.org/doi/full/10.1126/science.357.6358.1344 https://arxiv.org/abs/2310.02207 作者: Wes Gurnee & Max Tegmark 机构: 麻省理工学院 日期: 2023-10-03…

Linux设备模型(八) - sysfs

一&#xff0c;sysfs目录介绍 sysfs是一个基于内存的虚拟的文件系统&#xff0c;有kernel提供&#xff0c;挂载到/sys目录下&#xff0c;负责以设备树的形式向user space提供直观的设备和驱动信息。 sysfs以不同的视角展示当前系统接入的设备&#xff1a; /sys/block 历史遗…

滑动窗口算法

前言 滑动窗口作为一个考点较高的算法&#xff0c;广泛应用于子串问题中&#xff0c;本文将进行详细讲解。 一、滑动窗口是什么 滑动窗口是双指针算法的一种&#xff0c;基本思路为维护一个窗口&#xff0c;然后从前往后遍历元素进行运算。 二、滑动窗口算法和其他双指针算法…

Unity Samples和帧动画的问题

拖动序列帧图片和自己创建clip的帧率不同 我今天在创建帧动画的时候用了两种方式第一种是直接拖动序列帧图片到Hierachy&#xff0c;然后生成的第二种是这样我发现两者播放的动画速率不一样最后查了半天查不到原因。最后发现是Samples的原因&#xff0c;而且Unity把Samples这个…

分类预测 | Matlab基于GWO-RBF灰狼算法优化径向基神经网络的分类预测

分类预测 | Matlab基于GWO-RBF灰狼算法优化径向基神经网络的分类预测 目录 分类预测 | Matlab基于GWO-RBF灰狼算法优化径向基神经网络的分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 Matlab基于GWO-RBF灰狼算法优化径向基神经网络的分类预测。基于灰狼算法(GWO…

记一次Flink任务无限期INITIALIZING排查过程

1.前言 环境&#xff1a;Flink-1.16.1&#xff0c;部署模式&#xff1a;Flink On YARN&#xff0c;现象&#xff1a;Flink程序能正常提交到 YARN&#xff0c;Job状态是 RUNNING&#xff0c;而 Task状态一直处于 INITIALIZING&#xff0c;如下图&#xff1a; 通过界面可以看到…