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

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

一、题目

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.mrgr.cn/news/15487.html

相关文章:

  • SSH和Git的基本知识
  • Linux安装使用Apache(Windows下载,离线安装)
  • 24年9月计算机二级考试时间和备考经验‼️
  • Docker 安装
  • 【学术会议征稿】第三届航空航天与控制工程国际学术会议 (ICoACE 2024)
  • flink 核心概念(个人总结)
  • 使用docker compose一键部署 Openldap
  • knime一行代码都不用写,就可以清洗数据,详细文字
  • C语言的发展历程:从诞生到现代编程的基石
  • 深入理解Java代理模式:从静态到动态的实现与应用
  • 基于生成对抗模型GAN蒸馏的方法FAKD及其在EdgesSRGAN中的应用
  • 光纤FPV无人机技术详解
  • Dell 服务器 PowerEdge T440 驱动器故障
  • 【网络】P2P打洞原理
  • UE的Gameplay框架(一) —— GameMode与GameState
  • [解决]Invalid configuration `aarch64-openwrt-linux‘: machine `aarch64-openwrt
  • 19.神经网络 - 线性层及其他层介绍
  • 用例设计面试:微信发送语音的测试用例
  • 使用 FormCreate 渲染 Element Plus 表单
  • docker与宿主机之间拷贝文件