代码随想录算法训练营第六十天 | 图 | A星算法

Day 60 总结

  • 自己实现中遇到哪些困难
  • 今日收获,记录一下自己的学习时间
    • 13:00 - 14:00

BFS

题目:127. 骑士的攻击

给定两个坐标,搜索最短路径

使用 BFS,广度搜索,按层搜索找到最短路径

public class Main {public static void main(String[] args) {new Main().solve();}public void solve() {Scanner sc = null;try {sc = new Scanner(new File("1.txt"));} catch (FileNotFoundException e) {e.printStackTrace();}int n = sc.nextInt();for (int i=0; i<n; i++) {int a1 = sc.nextInt();int a2 = sc.nextInt();int b1 = sc.nextInt();int b2 = sc.nextInt();bfs(a1,a2,b1,b2);}}public void bfs(int a1, int a2, int b1, int b2) {int[][] dir = {{-2,-1}, {-2,1}, {-1,2}, {1,2}, {2,1}, {2,-1}, {1,-2}, {-1,-2},};Queue<int[]> queue = new LinkedList<>();queue.add(new int[]{a1,a2});int[][] moves = new int[1001][1001];// 1000 * 1000的棋盘while (!queue.isEmpty()) {int[] pos = queue.poll();int x = pos[0];int y = pos[1];if (x == b1 && y == b2) break;for (int i=0; i<8; i++) {int xx = x+dir[i][0];int yy = y+dir[i][1];if (xx >= 1 && xx <= 1000 && yy >= 1 && yy <= 1000 && moves[xx][yy]==0) {queue.add(new int[]{xx, yy});moves[xx][yy] = moves[x][y] + 1;}}}System.out.println(moves[b1][b2]);}
}

AStart

同样是BFS,但是有一些额外的信息

BFS 是没有目的性的 一圈一圈去搜索, 而 A * 是有方向性的去搜索

启发式函数 要影响的就是队列里元素的排序,去引导搜索方向

队列里节点进行排序,就需要给每一个节点权值

每个节点的权值为F,给出公式为:F = G + H

G:起点达到目前遍历节点的距离

H:目前遍历的节点到达终点的距离

距离计算公式

本题的图是无权网格状,在计算两点距离通常有如下三种计算方式:

  1. 曼哈顿距离,计算方式: d = abs(x1-x2)+abs(y1-y2)
  2. 欧氏距离(欧拉距离) ,计算方式:d = sqrt( (x1-x2)^2 + (y1-y2)^2 )
  3. 切比雪夫距离,计算方式:d = max(abs(x1 - x2), abs(y1 - y2))

本题,采用欧拉距离才能最大程度体现 点与点之间的距离。

所以 使用欧拉距离计算 和 广搜搜出来的最短路的节点数是一样的。 (路径可能不同,但路径上的节点数是相同的)

A * 算法的寻路过程,动画地址:https://kamacoder.com/tools/knight.html

通过优先级队列选择节点

@FunctionalInterface
interface Heuristic {int apply(int a1, int a2, int b1, int b2);
}public class Main {public static void main(String[] args) {new Main().solve();}public void solve() {Scanner sc = null;try {sc = new Scanner(new File("1.txt"));} catch (FileNotFoundException e) {e.printStackTrace();}int n = sc.nextInt();for (int i=0; i<n; i++) {int a1 = sc.nextInt();int a2 = sc.nextInt();int b1 = sc.nextInt();int b2 = sc.nextInt();Heuristic myHeuristic = (x1,y1,x2,y2) -> {return (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2);};AStar(a1,a2,b1,b2, myHeuristic);}}public void AStar(int a1, int a2, int b1, int b2, Heuristic heuristic) {int[][] dir = {{-2,-1}, {-2,1}, {-1,2}, {1,2}, {2,1}, {2,-1}, {1,-2}, {-1,-2},};PriorityQueue<int[]> queue = new PriorityQueue<int[]>((a, b) -> {return Integer.compare(a[2], b[2]);});queue.add(new int[]{a1,a2,0});int[][] moves = new int[1001][1001];// 1000 * 1000的棋盘while (!queue.isEmpty()) {int[] pos = queue.poll();int x = pos[0];int y = pos[1];int f = pos[2];if (x == b1 && y == b2) break;for (int i=0; i<8; i++) {int xx = x+dir[i][0];int yy = y+dir[i][1];if (xx >= 1 && xx <= 1000 && yy >= 1 && yy <= 1000 && moves[xx][yy]==0) {// 这里的g的计算为什么是这样子的啊?// 起点达到目前遍历节点的距离int g1 = heuristic.apply(a1, a2, xx, yy);int g = f + 5;int h = heuristic.apply(xx, yy, b1, b2);int ff = g + h;queue.add(new int[]{xx, yy, ff});moves[xx][yy] = moves[x][y] + 1;}}}System.out.println(moves[b1][b2]);}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【 Sonarqube】可视化Java项目单元测试覆盖率统计框架搭建

一、项目背景&#xff1a; 一个小公司的朋友反应他们那边Java项目单元测试有&#xff0c;但还没有可视化统计覆盖率数据&#xff0c;没法统计就不能直观的看到单测的覆盖率&#xff0c;Java的覆盖率统计框架还是比较成熟&#xff0c;部署起来也不是很难&#xff0c;下面我们逐…

PTA数据结构编程题7-1最大子列和问题

我参考的B站up的思路 题目 题目链接 给定K个整数组成的序列{ N 1 ​ , N 2 ​ , …, N K ​ }&#xff0c;“连续子列”被定义为{ N i ​ , N i1 ​ , …, N j ​ }&#xff0c;其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 1…

jangow-01-1.0.1靶机

靶机 ip&#xff1a;192.168.152.155 把靶机的网络模式调成和攻击机kali一样的网络模式&#xff0c;我的kali是NAT模式, 在系统启动时(长按shift键)直到显示以下界面 ,我们选第二个&#xff0c;按回车。 继续选择第二个&#xff0c;这次按 e 进入编辑页面 接下来&#xff0c;…

在Windows上读写Linux磁盘镜像的一种方法

背景 嵌入式开发中&#xff0c;经常会把系统的Linux磁盘镜像保存到Windows上&#xff0c;以便上传到网盘备份或发送给工厂&#xff0c;但是如果想读取/修改镜像中的某个文件&#xff0c;一般有2种方案&#xff1a; 直接访问 就是用虚拟磁盘软件将镜像文件挂载成磁盘&#xf…

apisix的hmac-auth认证

目录 1、apisix的hmac认证Authorization头信息 2、signature的lua生成源码 3、java生成签证的简单示例 4、postman调用如下 apisix的hmac-auth认证&#xff0c;介绍可以看官方文档 hmac-auth | Apache APISIX -- Cloud-Native API Gateway 照着官方文档&#xff0c;发现生…

某些iphone手机录音获取流stream延迟问题 以及 录音一次第二次不录音问题

一些型号的iphone手机录音获取流stream延迟问题 以及 录音一次第二次不录音问题 延迟问题 navigator.mediaDevices.getUserMedia({ audio: true }) .then((stream) > {console.log(stream) }&#xff09;从开始到获取stream会有将近2s的延迟 导致按下按钮开始录音 会有前…

大数据导论汇总

第一章 作业 2、请阐述把数据变得可用需要经过哪几个步骤. 答&#xff1a;一共要经历三个步骤&#xff1a;数据清洗、数据管理、数据分析。 第一步&#xff1a;数据清洗。使用数据的第一步通常是数据清洗&#xff0c;也就是把数据变成一种可用的状态。这个过程需要借助工具去…

React 组件的通信方式

在 React 应用开发中&#xff0c;组件之间的通信是构建复杂用户界面和交互逻辑的关键。正确地实现组件通信能够让我们的应用更加灵活和易于维护。以下是几种常见的 React组件通信方式。 一、父子组件通信 1. 通过 props 传递数据&#xff08;父组件向子组件传递数据&#xff0…

高级Python游戏开发:基于Pygame的2D平台跳跃游戏

在这篇文章中,我们将开发一个基于 Python 和 Pygame 的2D平台跳跃游戏。这个游戏将包含多个关卡、玩家角色的跳跃控制以及简单的敌人和障碍物。通过这个项目,你将学习如何使用 Pygame 创建更复杂的游戏逻辑,如何处理碰撞检测以及如何设计关卡系统。 一、项目设计概述 在这…

Hugging Face Dataset的 dataset_info.json 文件详解

Hugging Face Dataset的 dataset_info.json 文件详解 什么是 dataset_info.json 文件&#xff1f; 在使用 Hugging Face&#xff08;HF&#xff09;数据集时&#xff0c;dataset_info.json 文件是一个描述数据集及其元数据的重要配置文件。这个文件包含了有关数据集的基本信息…

【JDBC】转账案例

回顾 使用工具类查询表 需求&#xff1a; 查询student表的所有数据&#xff0c;把数据封装到一个集合中 数据准备 #创建表 CREATE TABLE student( sid INT, name VARCHAR(100), age INT, sex VARCHAR(100) ) #插入数据 INSERT INTO student VALUES(1,张三,18,女),(2…

dede-cms关于shell漏洞

一.文件式管理器 1.新建文件 新建一个php文件&#xff0c;内容写个php脚本语言 访问&#xff0c;可以运行 2.文件上传 上传一个php文件&#xff0c;内容同样写一个php代码 访问&#xff0c;运行成功 二.模块-广告管理 来到模块-广告管理——>增加一个新广告 在这里试一下…

k-Means聚类算法 HNUST【数据分析技术】(2025)

1.理论知识 K-means算法&#xff0c;又称为k均值算法。K-means算法中的k表示的是聚类为k个簇&#xff0c;means代表取每一个聚类中数据值的均值作为该簇的中心&#xff0c;或者称为质心&#xff0c;即用每一个的类的质心对该簇进行描述。K-Means算法接受参数K&#xff1b;然后将…

Opencv之对图片的处理和运算

Opencv实现对图片的处理和修改 目录 Opencv实现对图片的处理和修改灰度图读取灰度图转换灰度图 RBG图单通道图方法一方法二 单通道图显色合并单通道图 图片截取图片打码图片组合缩放格式1格式2 图像运算图像ma[m:n,x:y]b[m1:n1,x1:y1] add加权运算 灰度图 读取灰度图 imread(‘…

【算法思想04】二分查找

文章目录 1. 基本思想与实现1.1 基本思想1.2 值m的计算方式1.3 查找失败时的返回值1.4 代码实现1.4.1 循环1.4.2 递归 2. 性能分析2.1 时间复杂度2.2 与顺序查找的效率比较 3. 应用3.1 前提3.2 变体3.2.1 最基本的二分查找3.2.2 寻找左侧边界的二分查找3.2.3 寻找右侧边界的二分…

【brainpan靶场渗透】

文章目录 一、基础信息 二、信息收集 三、反弹shell 四、提权 一、基础信息 Kali IP&#xff1a;192.168.20.146 靶机 IP&#xff1a;192.168.20.155 二、信息收集 似乎开放了9999&#xff0c;10000端口&#xff0c;访问页面没有太多内容&#xff0c;扫描一下目录 dirs…

matlab reshape permute

1.reshape 将向量按照顺序重新构建 矩阵&#xff0c;新矩阵 先排完第一列&#xff0c; 再第二列… 2.permute 将向量 维度变换

【AI日记】24.12.29 kaggle 比赛 2-17

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加&#xff1a;kaggle 比赛 Regression with an Insurance Dataset时间&#xff1a;6 小时 读书 书名&#xff1a;教育的本质时间&#xff1a;1 小时 律己 工作时间&#xff1a;优作息&#xff1a…

【操作系统】哲学家进餐问题

目录 一、概念 二、以原子的思想解决死锁 三、破环环路的思想解决死锁 四、使用管程来解决死锁 一、概念 问题描述&#xff1a; 有五个哲学家&#xff0c;他们的生活方式是交替地进行思考和进餐&#xff0c;哲学家们共用一张圆桌&#xff0c;分别坐在周围的五张椅子上&…

comctl32.dll没有被指定在window运行怎么解决?

一、文件丢失问题&#xff1a;comctl32.dll没有被指定在Windows上运行怎么解决&#xff1f; comctl32.dll是Windows操作系统中的一个重要组件&#xff0c;它负责提供用户界面元素&#xff0c;如按钮、对话框和列表视图等。当系统提示“comctl32.dll没有被指定在Windows上运行”…