聚餐地计算(华为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;
    }
}
相关推荐
StackNoOverflow3 分钟前
Spring Boot 核心知识点总结
java·spring boot·后端
世界哪有真情4 分钟前
使用 Arthas 精准排查 SpringBoot 多模块项目中未使用的类(安全清理无用代码)
java·后端
Coovally AI模型快速验证8 分钟前
检测+跟踪一体化!4.39M参数、8.3W功耗,轻量化模型让无人机在露天矿实时巡检
算法·yolo·无人机·智能巡检·智慧矿山
softbangong11 分钟前
816-批量将图片分别转为pdf,文件夹下所有图片转为一个pdf
java·服务器·pdf·图片处理·图片转pdf·pdf工具·批量转换
玛卡巴卡ldf11 分钟前
【LeetCode 手撕算法】(矩阵)73-矩阵置零、54-螺旋矩阵(贪吃蛇)、48-旋转图像
java·数据结构·算法·leetcode·力扣
C^h11 分钟前
RTthread中的内存池理解
linux·数据库·c++·算法·嵌入式
深藏功yu名11 分钟前
Day25(高阶篇):RAG检索与重排序算法精研|从原理到参数调优,彻底攻克检索瓶颈
人工智能·算法·ai·自然语言处理·排序算法·agent
不吃香菜学java13 分钟前
苍穹外卖-新增套餐
java·spring boot·spring·tomcat·maven·mybatis
wangchunting14 分钟前
Spring Boot 概述
java·spring boot·后端
郝学胜-神的一滴16 分钟前
深入解析:生成器在UserList中的应用与Python可迭代对象实现原理
开发语言·python·程序人生·算法