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,一经查实,立即删除!

相关文章

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

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

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

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

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;那么度量指标…

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

英文名称: 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…

滑动窗口算法

前言 滑动窗口作为一个考点较高的算法&#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; 通过界面可以看到…

小火星露谷模组管理页面简介

1. 已有详细介绍的功能 模组管理页面部分功能已经有较为详细的介绍&#xff1a; 添加模组&#xff1a;https://svmbbs.smallfire.cn/d/15-dian-nao-zhong-yi-jing-you-duo-ge-mo-zu-ya-suo-wen-jian-ru-he-pi-liang-an-zhuang一键更新模组&#xff1a;https://svmbbs.smallfi…

python基础——入门必备知识

&#x1f4dd;前言&#xff1a; 本文为专栏python入门基础的第一篇&#xff0c;主要带大家先初步学习一下python中的一些基本知识&#xff0c;认识&#xff0c;了解一下python中的一些专有名词&#xff0c;为日后的学习打下良好的基础,。本文主要讲解以下的python中的基本语法&…

苹果发布iOS17.4正式版升级,罕见带来一大波新功能!苹果数据备份软件 iOS系统管理软件 苹果数据备份到icloud iOS系统数据处理

近日&#xff0c;苹果发布了iOS17.4正式版&#xff0c;没想到的是居然有一大波新功能&#xff0c;如果你也是用iPhone的话&#xff0c;尤其是iPhone15新系列的&#xff0c;那么推荐你一定要升级下。下面让我给大家详细讲讲&#xff1a; 「电池健康」升级 电池设置界面得到了优…

数字孪生10个技术栈:原型设计,界面从无到有雏形的第一步。

一、什么是原型设计 可视化界面的原型设计是指在设计过程中创建一个低保真或高保真的可视化模型&#xff0c;以展示和演示最终产品的外观、布局和交互。它是设计师和开发团队在实际开发之前用来验证和确认设计方案的一个重要步骤。 可视化界面的原型设计主要包括以下几个方面&…

【OpenCV】仿 IOS 锁屏时钟

OpenCV 是一个开源的计算机视觉&#xff08;Computer Vision&#xff09;与机器学习软件库&#xff0c;提供了多种图像处理算法与接口。在图像处理中&#xff0c;按位运算是一类重要的运算&#xff0c;可以用于提取图像的重要部分。本文主要记录如何使用 OpenCV-Python 绘制仿 …

grid布局所有元素在同一行显示且等分列

目录 一、问题 二、实现方式 三、总结 tiips:如嫌繁琐&#xff0c;直接移步总结即可&#xff01; 一、问题 1.grid布局可以通过 grid-template-columns来指定列的宽度。且可以通过repeat来指定重复的次数。但是现在的需求是&#xff1a;grid布局中元素的数量不确定&#…

一篇文章带你通关并查集(持续更新中)

这篇文章的所有题目均来自于自行整理&#xff0c;代码均来自于自行梳理调试&#xff08;思路可能比较暴力&#xff09;。初衷在于整理练习思路&#xff0c;且起到督促自己学习的作用 本文分成将三个模块 1.普及组 &#xff08;洛谷黄题&#xff09; 2.提高组 &#xff08;洛…

sqlserver 默认端口号不通 1433 开启监听

1.打开SQL Server 2022 配置管理器 查看这3个东西是否启用&#xff0c;然后双击TCP/IP 把默认端口全部设置成1433 然后cmd netstat -an | find "1433" 查看端口是否打开监听

存储架构 NAS 与 SAN:有什么区别?

SAN&#xff08;Storage Area Network&#xff09;和NAS&#xff08;Network Attached Storage&#xff09;是两种存储架构&#xff0c;它们在数据存储和管理方面有着不同的设计理念和应用场景。SAN通常将存储设备连接到一个独立的高速网络&#xff0c;而NAS则通过普通的网络协…

Unity性能优化篇(九) 模型优化之LOD技术概述以及操作方法

LOD模型优化技术概述: 1.LOD技术可以根据摄像头远近来显示不同精度的模型(例如吃鸡游戏 随着跳伞高度 来显示下面树木以及建筑的模型精度) LOD模型优化技术操作方法: 可使用Unity自带的LOD Group组件&#xff0c;并根据项目的情况来调整该组件的属性。Untiy资源商店也有一些其…