聚餐地计算(华为od机考题)

devtools/2024/11/20 11:26:15/

一、题目

1.原题

小华和小为是很要好的朋友,他们约定周末一起吃饭。
通过手机交流,
他们在地图上选择了多个聚餐地点
(由于自然地形等原因,部分聚餐地点不可达),
求小华和小为都能到达的聚餐地点有多少个?

2.题目理解

考点:[广搜, 矩阵, 并查集]

二、思路与代码过程

1.思路

输入:

地图map(包含餐厅1,可移动空间0,障碍物-1);

小华和小为出发位置。

计算过程:

使用队列初始存储出发位置,对方向数组进行遍历,(BFS),得到可以抵达的餐厅的位置数组表,将小华和小为的进行相同值筛选后得到都可以抵达的餐厅位置数组,对数组长度进行输出即可。

2.代码过程

①main函数

public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入地图长宽:");int m = sc.nextInt();int n = sc.nextInt();System.out.println("请输入地图(0:正常通行;-1:障碍;1:餐厅):");int[][] map = new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {map[i][j] = sc.nextInt();}}System.out.println("请输入小华位置:");int[] posH = new int[2];posH[0] = sc.nextInt();posH[1] = sc.nextInt();System.out.println("请输入小为位置:");int[] posW = new int[2];posW[0] = sc.nextInt();posW[1] = sc.nextInt();ArrayList<int[]>HCr = CountArrival(posH,map);ArrayList<int[]>WCr = CountArrival(posW,map);ArrayList<int[]>HWCR = CalBothCan(HCr,WCr);System.out.println("小华和小为都能到达的聚餐地点有:"+HWCR.size()+"个。");}

②CalBothCan

private static ArrayList<int[]> CalBothCan(ArrayList<int[]> hcr, ArrayList<int[]> wcr) {ArrayList<int[]> BR = new ArrayList<>();while (BR.size() < Math.min(hcr.size(), wcr.size())) {for (int[] i : hcr) {for (int[] j : wcr) {if (Arrays.equals(i, j)) {BR.add(i);}}}}return BR;}

③方向数组

static int[][] DIRECTION ={{0,1},{1,0},{0,-1},{-1,0}};//方向数组

④CountArrival

private static ArrayList<int[]> CountArrival(int[] pos, int[][] map) {boolean[][] visited = new boolean[map.length][map[0].length];//抵达标记防止重复Queue<int[]> Q = new LinkedList<>();Q.add(pos);visited[pos[0]][pos[1]] = true;ArrayList<int[]> CR = new ArrayList<>();while(!Q.isEmpty()) {int[] cur = Q.poll();visited[cur[0]][cur[1]] = true;for (int[] direction : DIRECTION) {int x = cur[0] + direction[0];int y = cur[1] + direction[1];if (x >= 0 && y >= 0 && x < map.length && y < map[0].length&&!visited[x][y]) {//在边界内if (map[x][y] == 0) {Q.add(new int[]{x,y});visited[x][y] = true;}if (map[x][y] == 1) {Q.add(new int[]{x,y});CR.add(new int[]{x,y});visited[x][y] = true;}if (map[x][y] == -1) {continue;}}}}return CR;}

三、运行结果

1.运行截图

2.完整代码

import java.util.*;public class test39 {public static void main(String[] args) {///*Scanner sc = new Scanner(System.in);System.out.println("请输入地图长宽:");int m = sc.nextInt();int n = sc.nextInt();System.out.println("请输入地图(0:正常通行;-1:障碍;1:餐厅):");int[][] map = new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {map[i][j] = sc.nextInt();}}//System.out.println(Arrays.deepToString(map));System.out.println("请输入小华位置:");int[] posH = new int[2];posH[0] = sc.nextInt();posH[1] = sc.nextInt();System.out.println("请输入小为位置:");int[] posW = new int[2];posW[0] = sc.nextInt();posW[1] = sc.nextInt();//*//*int[][] map = {{0,-1,-1,1},{0,1,-1,0},{-1,0,1,0},{0,-1,0,0}};int[] posH = {0,0};int[] posW = {3,3};*/ArrayList<int[]>HCr = CountArrival(posH,map);ArrayList<int[]>WCr = CountArrival(posW,map);ArrayList<int[]>HWCR = CalBothCan(HCr,WCr);System.out.println("小华和小为都能到达的聚餐地点有:"+HWCR.size()+"个。");}private static ArrayList<int[]> CalBothCan(ArrayList<int[]> hcr, ArrayList<int[]> wcr) {ArrayList<int[]> BR = new ArrayList<>();while (BR.size() < Math.min(hcr.size(), wcr.size())) {for (int[] i : hcr) {for (int[] j : wcr) {if (Arrays.equals(i, j)) {BR.add(i);}}}}return BR;}static int[][] DIRECTION ={{0,1},{1,0},{0,-1},{-1,0}};//方向数组private static ArrayList<int[]> CountArrival(int[] pos, int[][] map) {boolean[][] visited = new boolean[map.length][map[0].length];//抵达标记防止重复Queue<int[]> Q = new LinkedList<>();Q.add(pos);visited[pos[0]][pos[1]] = true;ArrayList<int[]> CR = new ArrayList<>();while(!Q.isEmpty()) {int[] cur = Q.poll();visited[cur[0]][cur[1]] = true;for (int[] direction : DIRECTION) {int x = cur[0] + direction[0];int y = cur[1] + direction[1];if (x >= 0 && y >= 0 && x < map.length && y < map[0].length&&!visited[x][y]) {//在边界内if (map[x][y] == 0) {Q.add(new int[]{x,y});visited[x][y] = true;}if (map[x][y] == 1) {Q.add(new int[]{x,y});CR.add(new int[]{x,y});visited[x][y] = true;}if (map[x][y] == -1) {continue;}}}}/*System.out.println("\n可抵达餐厅有:");for (int[] element : CR) {System.out.print(Arrays.toString(element));}System.out.println();*/return CR;}
}


http://www.ppmy.cn/devtools/104714.html

相关文章

Mysql基础练习题 1084.销售分析3 (力扣)

编写解决方案&#xff0c;报告 2019年春季 才售出的产品。即 仅 在 2019-01-01 &#xff08;含&#xff09;至 2019-03-31 &#xff08;含&#xff09;之间出售的商品 题目链接&#xff1a; https://leetcode.cn/problems/sales-analysis-iii/description/ 建表插入数据&…

python(9) : docker方式运行python程序(自启动,守护)

1.安装docker docker(6) : 离线安装docker_docker-19.03.9.tgz-CSDN博客 2.拉取python镜像 拉取python镜像 docker pull python 镜像加速(按需) : linux配置docker源&#xff0c;国内加速镜像&#xff08;注册阿里云镜像&#xff09;_docker加速 清华源-CSDN博客 3.启动py…

k8s helm

k8s Helm 是Kubernetes的包管理工具&#xff0c;类似于Linux系统中常用的apt、yum等包管理工具。Helm通过定义、安装和升级Kubernetes应用程序来简化Kubernetes应用部署的复杂性。以下是对k8s Helm的详细解析&#xff1a; 一、Helm的基本概念 Chart&#xff1a;Chart是Helm的…

WorkPlus安全即时通讯:端到端加密开启信息保密新时代

在数字化时代&#xff0c;信息的保密性和安全性变得越发重要。企业和个人需要确保他们的敏感信息和机密通讯不会落入黑客或第三方的手中。为了满足这一需求&#xff0c;WorkPlus安全即时通讯平台应运而生。作为一款拥有端到端加密功能的通讯平台&#xff0c;WorkPlus着重于保护…

SpringBoot 引入使用消息队列RabbitMQ通信 配置连接 无路由模式

介绍 请先对Rabbitmq的用户和权限配置好在进行往下的操作 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>下面将演示最简单的例子不过路由 生产者 -&g…

neural-admixture:基于AI的快速基因组聚类

最近学习祖源分析方面的内容&#xff0c;发现已经有了GPU版的软件&#xff0c;可以几十倍地加快运算速度&#xff0c;推荐使用&#xff01;小数据集的话家用显卡即可hold住&#xff0c;十分给力&#xff01; ADMIXTURE 是常用的群体遗传学分析工具&#xff0c;可以估计个体的祖…

文件上传漏洞详解

第一关 步骤一&#xff0c;打开第一关先点击浏览上传一个jpg格式的图片 步骤二&#xff0c;打开BP修改jpg为php然后放包 步骤三&#xff0c;右键打开图像 成功解析 步骤四&#xff0c;打开蚁剑 第一关还是蛮简单的 第二关 步骤一&#xff0c;打开第二关先点击浏览上传一个j…

问:final关键字在JAVA中有哪些用法?

final关键字的问题在面试中很常见&#xff0c;深入理解其背后的机制确实能提升对Java语言特性的掌握程度。下面&#xff0c;代码示例来说明final的用法。 1. 被final修饰的类不可以被继承 final class FinalClass {// 类内容 }// 错误示例&#xff1a;尝试继承FinalClass // …