2022-04-19:A*算法,
过程和Dijskra高度相处,
有到终点的预估函数,
只要预估值<=客观上最优距离,就是对的。
预估函数是一种吸引力:
1)合适的吸引力可以提升算法的速度;
2)吸引力“过强”会出现错误。

答案2022-04-19:

具体见代码。

代码用rust编写。代码如下:

use rand::Rng;
fn main() {
let mut map: Vec<Vec<isize>> = vec![];
for i in 0..10 {
map.push(vec![]);
for j in 0..10 {
map[i].push(0);
}
}
for i in 0..map.len() {
for j in 0..map[0].len() {
map[i][j] = rand::thread_rng().gen_range(1, 10);
}
}
let startX: isize = 0;
let startY: isize = 0;
let targetX: isize = 4;
let targetY: isize = 7;
let ret: isize = min_distance2(&mut map, startX, startY, targetX, targetY);
for i in 0..10 {
println!("{:?}", map[i]);
}
println!("{}", ret);
} const MAX_VALUE: isize = 9223372036854775807; fn min_distance2(
map: &mut Vec<Vec<isize>>,
startX: isize,
startY: isize,
targetX: isize,
targetY: isize,
) -> isize {
if map[startX as usize][startY as usize] == 0 || map[targetX as usize][targetY as usize] == 0 {
return MAX_VALUE;
}
let n = map.len() as isize;
let m = map[0].len() as isize;
let mut heap: Vec<Vec<isize>> = Vec::new();
let mut closed: Vec<Vec<bool>> = Vec::new();
for i in 0..n {
closed.push(Vec::new());
for j in 0..m {
closed[i as usize].push(false);
}
}
let mut t = vec![
map[startX as usize][startY as usize],
distance(startX, startY, targetX, targetY),
startX,
startY,
];
heap.push(t);
let mut ans = MAX_VALUE;
while heap.len() > 0 {
//用切片模拟堆,所以需要排序
heap.sort_by(|x, y| (x[0] + x[1]).cmp(&(y[0] + y[1]))); // 报错
// let mut cur: &Vec<isize> = &(heap[0]);
// heap.remove(0); let mut fromDistance: isize = heap[0][0];
let mut row: isize = heap[0][2];
let mut col: isize = heap[0][3];
heap.remove(0); //必须放在这里
if (closed[row as usize][col as usize]) {
continue;
}
closed[row as usize][col as usize] = true;
if (row == targetX && col == targetY) {
ans = fromDistance;
break;
}
add2(
fromDistance,
row - 1,
col,
targetX,
targetY,
n,
m,
map,
&mut closed,
&mut heap,
);
add2(
fromDistance,
row + 1,
col,
targetX,
targetY,
n,
m,
map,
&mut closed,
&mut heap,
);
add2(
fromDistance,
row,
col - 1,
targetX,
targetY,
n,
m,
map,
&mut closed,
&mut heap,
);
add2(
fromDistance,
row,
col + 1,
targetX,
targetY,
n,
m,
map,
&mut closed,
&mut heap,
);
}
return ans;
} fn add2(
pre: isize,
row: isize,
col: isize,
targetX: isize,
targetY: isize,
n: isize,
m: isize,
map: &mut Vec<Vec<isize>>,
closed: &mut Vec<Vec<bool>>,
heap: &mut Vec<Vec<isize>>,
) {
if (row >= 0
&& row < n
&& col >= 0
&& col < m
&& map[row as usize][col as usize] != 0
&& !closed[row as usize][col as usize])
{
let mut t = vec![
pre + map[row as usize][col as usize],
distance(row, col, targetX, targetY),
row,
col,
];
heap.push(t);
}
} // 曼哈顿距离
fn distance(curX: isize, curY: isize, targetX: isize, targetY: isize) -> isize {
return abs(targetX - curX) + abs(targetY - curY);
} fn abs(a: isize) -> isize {
if a < 0 {
-a
} else {
a
}
}

执行结果如下:


左神java代码

2022-04-19:A*算法, 过程和Dijskra高度相处, 有到终点的预估函数, 只要预估值<=客观上最优距离,就是对的。 预估函数是一种吸引力: 1)合适的吸引力可以提升算法的速度; 2)吸引的更多相关文章

  1. 【2022.04.19】Docker-compose一键安装mirai,搭建QQ机器人最快方法

    先用官方的脚本安装下docker curl -sSL https://get.docker.com/ | sh 安装docker-compose curl -L "https://githu ...

  2. Adaboost提升算法从原理到实践

    1.基本思想: 综合某些专家的判断,往往要比一个专家单独的判断要好.在"强可学习"和"弱科学习"的概念上来说就是我们通过对多个弱可学习的算法进行"组合 ...

  3. [机器学习]-Adaboost提升算法从原理到实践

    1.基本思想: 综合某些专家的判断,往往要比一个专家单独的判断要好.在”强可学习”和”弱可学习”的概念上来说就是我们通过对多个弱可学习的算法进行”组合提升或者说是强化”得到一个性能赶超强可学习算法的算 ...

  4. 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类

    不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...

  5. 机器学习第5周--炼数成金-----决策树,组合提升算法,bagging和adaboost,随机森林。

    决策树decision tree 什么是决策树输入:学习集输出:分类觃则(决策树) 决策树算法概述 70年代后期至80年代初期,Quinlan开发了ID3算法(迭代的二分器)Quinlan改迚了ID3 ...

  6. 学习图像算法阶段性总结 (附一键修图Demo) 2016.04.19更新demo

    今天特别感慨,自己从决定研究图像处理,势必要做出一键修图算法. 经历了,三个多月的书籍积累,三个多月的算法调整以及优化. 人是一种奇怪的动物,当你做不到的时候,你以为做到了,自己会感觉很爽,很有成就感 ...

  7. Python的函数式编程-传入函数、排序算法、函数作为返回值、匿名函数、偏函数、装饰器

    函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

  8. 非负权值有向图上的单源最短路径算法之Dijkstra算法

    问题的提法是:给定一个没有负权值的有向图和其中一个点src作为源点(source),求从点src到其余个点的最短路径及路径长度.求解该问题的算法一般为Dijkstra算法. 假设图顶点个数为n,则针对 ...

  9. 【Java/Android性能优5】 Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强

    本文转自:http://www.trinea.cn/android/android-imagecache/ 主要介绍一个支持图片自动预取.支持多种缓存算法.支持二级缓存.支持数据保存和恢复的图片缓存的 ...

  10. eclipse在Ubuntu 13.04下的安装过程

    eclipse在Ubuntu 13.04下的安装过程及问题小记 一.eclipse安装过程 首先确保在安装eclipse之前已经安装好Java虚拟机 1. eclipse官网下载压缩包 下载地址:ht ...

随机推荐

  1. 动态生成frame时需要对frame类进行注册,否则会出现找不到frame类的错误。

    procedure TMainForm.openFram(Caption, FormClassName, imgIdx: string); var i: integer; sheet: TUniTab ...

  2. Zip Slip漏洞审计实战

    前言 最近看到许少的推有说到Zip Slip这个漏洞导致的RCE,其实我在代码审计的时候确实发现有不少功能模块都是使用ZIP来解压,其实还是在真实系统中经常见到的. 于是想着好久没有写过博客了,想借着 ...

  3. IDEA: 如何导入项目模块 以及 将 Java程序打包 JAR 详细步骤

    IDEA: 如何导入项目模块 以及 将 Java程序打包 JAR 详细步骤 . @ 目录 IDEA: 如何导入项目模块 以及 将 Java程序打包 JAR 详细步骤 IDEA 导入项目模块 Modul ...

  4. Android笔记--文本输入

    编辑框EditText 相关内部部件取下: inputType的类型如下: 具体实现: 不同边框的实现: 焦点变更监听器 具体实现: 文本变化监听器 具体实现:

  5. Bitcask — 日志结构的快速 KV 存储引擎

    Bitcask 介绍 Bitcask 是一种高性能的键值存储引擎,基于日志结构和哈希索引来提供高速的读写操作和数据持久性,适用于处理大量写入请求和快速查找键值对的应用场景. 核心概念 Bitcask ...

  6. flutter util---->常用的一些工具方法

    copy text to clipboard Clipboard.setData(ClipboardData(text: string)); since Flutter1.9, you can use ...

  7. 从源码解析Go exec timeout 实现机制

    1. 背景 环境:golang 1.9,drawn 测试使用golang exec 执行命令,并配置过期时间,测试脚本如下. 现象:执行脚本后,到超时时间后并为超时退出,反而阻塞住了 func Tes ...

  8. ICMP隐蔽隧道攻击分析与检测(三)

    • ICMP隧道攻击工具特征分析 一.原理 由于ICMP报文自身可以携带数据,而且ICMP报文是由系统内核处理的,不占用任何端口,因此具有很高的隐蔽性. 通过改变操作系统默认填充的Data,替换成自己 ...

  9. 股票K线图概要——R语言

    K线图是200多年前日本人发明的,后来传入了美国.K线图本来就是对当前数据的可视化显示而已,但是越来越多的人对K线图做出了痴迷的分析和解读,有众多追随者也根据K线图指导自己的具体行动,因此,K线图在实 ...

  10. pysimplegui之调试输出(easy_print = Print = eprint)

    "Easy" API 系列中的另一个调用是EasyPrint. 与其他常用的 PySimpleGUI 调用一样,同一个调用还有其他名称.您可以使用Print或eprint除了Eas ...