当前位置: 首页 > news >正文

机器人走迷宫问题

题目

1.房间有XY的方格组成,例如下图为64的大小。每一个方格以坐标(x,y) 描述。
2.机器人固定从方格(0, 0)出发,只能向东或者向北前进,出口固定为房间的最东北角,如下图的
方格(5,3)。用例保证机器人可以从入口走到出口。
3.房间有些方格是墙壁,如(4,1) ,机器人不能经过那儿。
4.有些地方是- -旦到达就无法走到出口的,如标记为B的方格,称之为陷阱方格。
5.有些地方是机器人无法达到的,如标记为A的方格,称之为不可达方格,不可达方格不包括墙壁
所在的位置
6.如下实例图中,陷阱方格有2个,不可达方格有3个。
7.请为该机器人实现路径规划功能:给定房间大小,墙壁位置,请计算出陷阱方格与不可达方格分别有多少个

在这里插入图片描述

输入
1.第一-行为房间的x和y(0 < x,y <= 1000 )
2.第二行为房间中墙壁的个数N (O <= N < x*Y)
3.接着下面会有N行墙壁的坐标

同一行中如果有多个数据以一个空格隔开,用例保证所有的输入数据均合法,(结尾不带回车换行

输出

1.陷阱方格与不可达方格数量,两个信息在一行中输出, 以一个空格隔开。(结尾不带回车换行)

在这里插入图片描述

Java代码

package day11;import javax.print.attribute.standard.Chromaticity;
import java.util.HashSet;
import java.util.Objects;
import java.util.Scanner;
import java.util.Set;public class MazeSolving {static int xLength;static int yLength;static class CheckModel{int x;int y;public CheckModel(int x,int y){this.x = x;this.y = y;}@Overridepublic int hashCode(){return Objects.hash(x, y);}@Overridepublic boolean equals(Object o){if(o==this){return true;}if(o==null||getClass()!=o.getClass()){return false;}CheckModel check = (CheckModel) o;return x == check.x && y==check.y;}}//wallSet代表墙壁坐标,checkSet用于存储在搜索路径过程中检查过的坐标,finishSet用于存储已经找到终点的坐标private static void findItOut(int x, int y, Set<CheckModel> wallSet, Set<CheckModel> checkSet, Set<CheckModel> finishSet) {if(yLength-1==y&&xLength-1==x){finishSet.add(new CheckModel(x,y));//检查当前坐标 (x, y) 是否是迷宫的终点}if(yLength<=y||x>=xLength){return;  //越界了}checkSet.add(new CheckModel(x,y));//否则添加到已检查坐标//北方向if(!wallSet.contains(new CheckModel(x,y+1))){findItOut(x,y+1,wallSet,checkSet,finishSet);}else{finishSet.add(new CheckModel(x,y));}//东方向if(!wallSet.contains(new CheckModel(x+1,y))){findItOut(x+1,y,wallSet,checkSet,finishSet);}else{finishSet.add(new CheckModel(x,y));}}public static void main(String[] args){try {Scanner sc = new Scanner(System.in);xLength = sc.nextInt();yLength = sc.nextInt();int size = sc.nextInt();int[][] values = new int[size][2];for(int i = 0; i < size; i++){values[i][0] = sc.nextInt();values[i][1] = sc.nextInt();}int trapCount = 0;int invalidCount = 0;Set<CheckModel> wallHashSet = new HashSet<>();for(int[] wall:values){wallHashSet.add(new CheckModel(wall[0],wall[1]));}Set<CheckModel> checksHashSet = new HashSet<>();Set<CheckModel> finshHashSet = new HashSet<>();findItOut(0,0,wallHashSet,checksHashSet,finshHashSet);invalidCount = xLength*yLength-checksHashSet.size()-wallHashSet.size();//整个迷宫中的格子数减去检查过的格子数和包含障碍物的格子数等于无法到达数量/** 这里使用 finishHashSet 中的每个坐标作为起点,再次调用 findItOut 进行深度优先搜索。* 如果搜索得到的路径中不包含终点 (xLength - 1, yLength - 1),则说明这条路径是无效的,* trapCount 就会增加。这样,trapCount 表示的是无效的路径的数量。** */for(CheckModel model:finshHashSet){Set<CheckModel> checksT = new HashSet<>();Set<CheckModel> finishT = new HashSet<>();findItOut(model.x, model.y, wallHashSet,checksT,finishT);if(!finishT.contains(new CheckModel(xLength-1,yLength-1))){trapCount++;}}System.out.println(trapCount+" "+invalidCount);}catch (Exception e){e.printStackTrace();System.out.println("input error");}}}
http://www.lryc.cn/news/237717.html

相关文章:

  • 轻量封装WebGPU渲染系统示例<36>- 广告板(Billboard)(WGSL源码)
  • Java 多线程进阶
  • CentOS上搭建SVN并自动同步至web目录
  • .Net中Redis的基本使用
  • 使用cli批量下载GitHub仓库中所有的release
  • 深入分析TaskView源码之触摸相关
  • 键盘快捷键工具Keyboard Maestro mac中文版介绍
  • Dubbo开发系列
  • 周赛372(正难则反、枚举+贪心、异或位运算、离线+单调栈)
  • 存储区域网络(SAN)之FC-SAN和IP-SAN的比较
  • Leetcode_45:跳跃游戏 II
  • 给新手教师的成长建议
  • 新手教师如何迅速成长
  • 竞赛选题 深度学习验证码识别 - 机器视觉 python opencv
  • 提升工作效率,使用AnyTXT Searcher实现远程办公速查公司电脑文件——“cpolar内网穿透”
  • mybatis使用foreach标签实现union集合操作
  • 请问DasViewer是否支持与业务系统集成,将业务的动态的数据实时的展示到三维模型上?
  • [ruby on rails]rack-cors, rack-attack
  • 猫12分类:使用多线程爬取图片的Python程序
  • 《深度学习500问》外链笔记
  • 机器学习技术栈—— 概率学基础
  • 使用Redis实现分布式锁
  • linux 服务器进程、端口查找,nginx 配置日志查找,lsof 命令详解
  • 汽车标定技术--A2L格式分析
  • Linux操作系统使用及C高级编程-D9D10Linux 服务搭建与使用
  • git下载安装配置及Git在Gitee上拉取和上传代码教程
  • ospf路由选路及路由汇总
  • Oracle 11g 多数据库环境下的TDE设置
  • vue3使用pinia实现数据缓存
  • 【CSS】min 和 max 函数(设置最大最小值)