[华为OD]C卷 BFS 亲子游戏 200

题目:

宝宝和妈妈参加亲子游戏,在一个二维矩阵(N*N)的格子地图上,宝宝和妈妈抽签决定各自 

的位置,地图上每个格子有不同的Q糖果数量,部分格子有障碍物。

游戏规则Q是妈妈必须在最短的时间(每个单位时间只能走一步)到达宝宝的位置,路上的

所有糖果都可以拿走,不能走障碍物的格子,只能上下左右走。

请问妈妈在最短到达宝宝位置的时间内最多拿到多少糖果(优先考虑最短时间到达的情况下尽 

可能多拿糖果)。

输入描述

第一行输入为N, N标识二维矩阵的大小

之后N行,每行有N个值,表格矩阵每个位置的值

其中:

- 3:妈妈

- 2:宝宝

- 1:障碍

> =0:糖果数(0表示没有糖果,但是可以走)

输出描述

输出妈妈在最短到达宝宝位置的时间内最多拿到多少糖果,行末无多余空格

备注

地图最大50*50

示例1:

输入

4

3 2 1 -3

1 -1 1 1

1 1 -1 2

-2 1 2 3

输出

9

说明

此地图有两条最短路径Q可到宝宝位置, 都是最短路径6步,但先向下再向左可以拿到9个糖

示例2:

输入

4

3 2 1 -3

-1 -1 1 1

1 1 -1 2

-2 1 -1 3

输出

-1

说明

此地图妈妈无法到达宝宝位置

题解:

图求最短路径,采用BFS搜索,关于BFS,推荐观看:BFS广搜解决迷宫问题_哔哩哔哩_bilibili

看完基本就清楚BFS算法原理了。

这题里面因为有糖果数目,所以这边采用的方法是,如果下一步能走到终点,那么终点位置的visit[endx][endy]不设置为1.这样其他方案走到终点的话,也能加入进队列里面。但是由于队列里面取首元素是终点的话,那么就不会往下找了,所以,搜索记录的应该也都是比较短的路线。然后再依旧采用一个List记录到终点的步数,一个Map记录到终点的步数和糖果数的结果。最后找到最少的步数,对应的最多糖果数就可以了。

代码:

import java.util.*;

public class FindCandy {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = Integer.valueOf(sc.nextLine());
        int nums[][] = new int[n][n];
        int stratPosX = Integer.MIN_VALUE;
        int stratPosY = Integer.MIN_VALUE;
        int childPosX = Integer.MIN_VALUE;
        int childPosY = Integer.MIN_VALUE;

        int visited[][] = new int[n][n];
        for (int i = 0; i < n; i++) {
            String path[] = sc.nextLine().split(" ");
            for (int j = 0; j < n; j++) {
                visited[i][j] = 0;
                nums[i][j] = Integer.valueOf(path[j]);
                if (nums[i][j] == -3) {
                    stratPosX = i;
                    stratPosY = j;
                    visited[i][j] = 1;
                }
                if (nums[i][j] == -2) {
                    childPosX = i;
                    childPosY = j;
                }
            }
        }

        int[][] directions = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
        Queue<Steps> queue = new LinkedList<>();
        Steps firstStep = new Steps(stratPosX, stratPosY, 0, 0);
        visited[stratPosX][stratPosY] = 1;
        Steps endStep = new Steps(childPosX, childPosY, 0, 0);
        queue.offer(firstStep);

        List<Integer> finalRoteSteps = new ArrayList<>();
        Map<Integer, List<Integer>> stepCandyMap = new HashMap<>();
        boolean hasRoote = false;
        while (!queue.isEmpty()) {
            Steps frontStep = ((LinkedList<Steps>) queue).getFirst();
            if (frontStep.x == endStep.x && firstStep.y == endStep.y) {
                hasRoote = true;
                continue;
            }

            for (int i = 0; i < 4; i++) {
                int newX = frontStep.x + directions[i][0];
                int newY = frontStep.y + directions[i][1];

                if (newX >= 0 && newX < n && newY >= 0 && newY < n && nums[newX][newY] != -1 && visited[newX][newY] == 0) {
//                    System.out.println("newX= " + newX + " newY " + newY + " candy " + nums[newX][newY]);
                    Steps nextStep = new Steps();
                    if (newX == endStep.x && newY == endStep.y) {
                        nextStep = new Steps(newX, newY, frontStep.getStep() + 1, frontStep.getCandy());
                        queue.offer(nextStep);
                        finalRoteSteps.add(nextStep.step);
                        List<Integer> candyList = stepCandyMap.containsKey(nextStep.step) ? stepCandyMap.get(nextStep.step) :
                                new ArrayList<>();
                        if (!candyList.contains(nextStep.candy)) {
                            candyList.add(nextStep.candy);
                        }
                        stepCandyMap.put(nextStep.step, candyList);
                        hasRoote = true;
                    } else {
                        nextStep = new Steps(newX, newY, frontStep.getStep() + 1, frontStep.getCandy() + nums[newX][newY]);
                        visited[newX][newY] = 1;
                        queue.offer(nextStep);
                    }
                }
            }
            ((LinkedList<Steps>) queue).pollFirst();
        }

        if (hasRoote) {
            Collections.sort(finalRoteSteps);
            List<Integer> candys = stepCandyMap.get(finalRoteSteps.get(0));
            Collections.sort(candys);
            System.out.println(candys.get(candys.size() - 1));
        } else {
            System.out.println(-1);
        }
    }
}

class Steps {
    int x;
    int y;
    int step;
    int candy;

    public Steps() {
    }

    public Steps(int x, int y, int step, int candy) {
        this.x = x;
        this.y = y;
        this.step = step;
        this.candy = candy;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getStep() {
        return step;
    }

    public void setStep(int step) {
        this.step = step;
    }

    public int getCandy() {
        return candy;
    }

    public void setCandy(int candy) {
        this.candy = candy;
    }
}

验证:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/603700.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

我独自升级崛起账号注册 我独自升级怎么注册账号

近期&#xff0c;《我独自升级》这部动画凭借爆棚的人气&#xff0c;在各大平台上掀起了一阵观看热潮&#xff0c;其影响力不容小觑。借此时机&#xff0c;韩国游戏巨头网石集团敏捷响应&#xff0c;顺势推出了同名游戏《我独自升级&#xff1a;ARISE》&#xff0c;为粉丝们搭建…

淘宝/天猫商品描述API(taobao.item_get_desc)返回值详解

淘宝/天猫的商品描述API&#xff08;taobao.item_get_desc&#xff09;允许开发者获取指定商品的详细描述信息。这对于需要进行商品数据分析、构建商品详情页面或进行其他与商品相关的应用开发非常有用。下面&#xff0c;我们将详细解析这个API的返回值。 一、API概述 taobao.…

接收区块链的CCF会议--NDSS 2025 截止7.10 附录用率

会议名称&#xff1a;Network and Distributed System Security Symposium (NDSS) CCF等级&#xff1a;CCF A类学术会议 类别&#xff1a;网络与信息安全 录用率&#xff1a;2024年接收率19.5% Submissions are solicited in, but not limited to, the following areas: Ant…

【Qt】掌握Qt界面开发:窗口属性与资源嵌入技巧解析

文章目录 前言&#xff1a;1. windowTitle: 窗口标题2. windowIcon&#xff1a;窗口图标3. qrc 机制&#xff1a;4. windowOpacity&#xff1a;半透明效果总结&#xff1a; 前言&#xff1a; 在软件开发中&#xff0c;用户界面&#xff08;UI&#xff09;的构建是一个重要环节…

Deepsort算法研究

目录 1. 基于检测的多目标跟踪策略 1.1 多目标跟踪任务模型 1.2 多目标跟踪算法 SORT 1.3 DeepSORT 算法 2 . 基于轨迹的学生行为分类模型 2.1 学生行为分类规则 2.2 实际场景分析 1. 基于检测的多目标跟踪策略 多目标跟踪任务涉及跟踪多个目标的身份信息关联&#x…

C++类和对象(基础篇)

前言&#xff1a; 其实任何东西&#xff0c;只要你想学&#xff0c;没人能挡得住你&#xff0c;而且其实学的也很快。那么本篇开始学习类和对象&#xff08;C的&#xff0c;由于作者有Java基础&#xff0c;可能有些东西过得很快&#xff09;。 struct在C中的含义&#xff1a; …

组件通信-props详解

目录 一、什么是prop 二、props校验 三、组件中prop和data的区别 一、什么是prop Prop定义&#xff1a;组件上注册的一些自定义属性。 Prop作用&#xff1a;向子组件传递数据。 特点&#xff1a; 可以传递任意数量的prop可以传递任意类型的prop 二、props校验 组件的pr…

智能化采购管理系统助力光伏行业提高效率

光伏行业是指太阳能电池板的制造、安装和维护等相关产业&#xff0c;是新能源领域的重要组成部分。近年来&#xff0c;随着全球对于环保和可持续发展的重视&#xff0c;光伏行业进入全球化和智能化的新阶段。光伏企业开始加强国际合作&#xff0c;推广智能化技术&#xff0c;提…

数据结构学习/复习11--二叉树分治与递归思想练习题

一、二叉树相关练习题 1.判断单值二叉树 2. 判断两颗树是否相同 3.先序遍历的实现 注意事项&#xff1a;此处中的数组的下标用指针控制&#xff0c;因为受到递归与函数栈帧创建与销毁的影响。最后的返回值是指向前序遍历排好后的数组指针 4.判断一棵树是否是另一棵树的子树 …

速来get!多微信聚合聊天功能大揭秘!

随着网络时代的发展&#xff0c;微信成为了职场中不可或缺的沟通工具&#xff0c;很多人都有着多个微信号&#xff0c;而要想高效管理这些账号&#xff0c;那就少不了工具的帮忙。 通过微信管理系统&#xff0c;可以轻松实现多个微信号聚合聊天&#xff0c;提高沟通效率。 1、…

电商风口的最后一班快车?有些人甚至正在All in视频号!

我是王路飞。 当抖音、快手、淘宝上的商家还在内卷的时候&#xff0c;有些人却转移了阵地&#xff0c;搭上了电商风口的“最后一般列车”&#xff0c;甚至正在All in 视频号。 内容来源于【醒醒团队-电商王路飞】 随着“微视”想要三分天下野心的失败&#xff08;与抖音、快手…

ansible 深入介绍之 主机清单与playbook

目录​​​​​​​ 一 inventory 主机清单 1&#xff0c;主机清单 是什么 2&#xff0c;主机清单 定义方式 2.1 自定义主机端口 2.2 定义 范围ip 地址 2.3 定义 拥有相似的主机名 3&#xff0c; inventory 中的变量 3.1 常见 变量 3.2 主机变量 3.3 组变量 3.…

c语言练习5.8

1.分析代码 VS开发环境调试下面的代码&#xff0c;画图解释下面代码的问题 #include <stdio.h> int main() {int i 0;int arr[] {1,2,3,4,5,6,7,8,9,10};for(i0; i<12; i){arr[i] 0;printf("hello bit\n");}return 0; } 分析: 2.喝汽水问题 喝汽水&a…

Python数据可视化------地图

基础地图使用 # 地图基本演示 # 导包 from pyecharts.charts import Map from pyecharts.options import TitleOpts, VisualMapOpts# 准备地图对象 cmap Map() # 准备数据&#xff08;列表&#xff09; data [("北京市", 99), ("上海市", 199), ("…

淘宝扭蛋机小程序,开启你的惊喜探索之旅!

亲爱的淘宝用户们&#xff0c;我们非常高兴地宣布&#xff0c;全新的淘宝扭蛋机小程序即将上线&#xff01;这是一款集合了趣味、惊喜与购物乐趣于一体的创新应用&#xff0c;让你在淘宝的海洋里&#xff0c;找到那份独特的快乐。 一、淘宝扭蛋机小程序是什么&#xff1f; 淘…

后端常用技能:解决java项目前后端传输数据中文出现乱码、问号问题

0. 问题背景 最近做一个解析数据的小工具&#xff0c;本地运行时都正常&#xff0c;发布到服务器上后在导出文件数据时发现中文全部变成了问号&#xff0c;特此记录下问题解决的思路和过程 1. 环境 java 1.8 springboot 2.6.13 额外引入了fastjson&#xff0c;commons-csv等…

Linux网络编程:TCP编程实现

目录 1、前言 2、函数介绍 2.1 socket函数 与 通信域 2.2 bind函数 与 通信结构体 2.2.1 domain通信地址族 与 通信结构体 2.2.2 IPv4地址族结构体 2.2.3 通用地址族结构体 2.2.4 示例&#xff1a;为套接字fd绑定通信结构体addr 2.3 listen函数 与 accept函数 …

onlyoffice容器打包成镜像

书接上篇&#xff0c;onlyoffice容器已经更改在本地docker环境中了&#xff0c;之后需要部署到测试环境的docker中&#xff0c;采用容器打包成本地镜像 1、本地docker 查看容器&#xff1a;docker ps 生成镜像&#xff1a;docker commit -p blissful_lichterman 重命名镜像&a…

MySql表的增删查改(CRUD)

对表中的数据操作分为4大类&#xff0c;增加数据&#xff0c;删除数据&#xff0c;查找数据&#xff0c;修改数据。对表中的数据进行增删查改操作简称为CRUD。Create(增),Retrieve(查找),Updata(修改&#xff09;,Delete(删除)CRUD的操作是对表中的数据进行操作的&#xff0c;是…

RTT PIN设备学习

获取GPIO编号 GET_PIN(port, pin)#define LED_BLUE_PIN GET_PIN(A, 0)设置引脚模式 void rt_pin_mode(rt_base_t pin, rt_base_t mode);设置引脚电平 void rt_pin_write(rt_base_t pin, rt_base_t value);rt_base_t pin 同上&#xff0c; 为引脚编号&#xff0c;尽量通过宏定…