聚餐地计算(华为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;
    }
}
相关推荐
lareina_yy几秒前
Android Studio新建工程(Java语言环境)
android·java·android studio
51码上有猿2 分钟前
基于springboot的在线租房系统设计与实现
java
惜.己6 分钟前
基于Spring搭建SpringMvc框架
java·开发语言·后端·spring·tomcat·mvc·idea
箬敏伊儿9 分钟前
springboot项目中 前端浏览器访问时遇到跨域请求问题CORS怎么解决?has been blocked by CORS policy
java·前端·spring boot·后端·spring
MogulNemenis25 分钟前
力扣100题——技巧
算法·leetcode
每天瞎忙的农民工34 分钟前
PHP常用的几种算法
算法·php
Dylanioucn36 分钟前
【编程底层思考】什么是GC Roots
java·jvm
_晓夏_37 分钟前
【JVM 工具命令】JAVA程序线上问题诊断,JVM工具命令的使用,jstat, jstack,jmap命令的使用
java·开发语言·jvm·jvm命令工具·java程序线上问题定位命令·java程序问题故障排查命令·jvm线上问题故障排查
Ty_11061 小时前
深入理解Java虚拟机:Jvm总结-虚拟机字节码执行引擎
java·开发语言·jvm
175063319451 小时前
Matlab/Simulink中PMSM模型的反电动势系数和转矩系数
算法·机器学习·matlab