news 2026/2/8 7:46:02

代码随想录算法训练营第五十三天 | Floyd 算法 A * 算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
代码随想录算法训练营第五十三天 | Floyd 算法 A * 算法
package main import ( "bufio" "fmt" "os" ) const INF = 10005 func min(a, b int) int { if a < b { return a } return b } func main() { in := bufio.NewReader(os.Stdin) var n, m int fmt.Fscan(in, &n, &m) // grid[i][j] 表示 i -> j 的最短距离 grid := make([][]int, n+1) for i := 0; i <= n; i++ { grid[i] = make([]int, n+1) for j := 0; j <= n; j++ { grid[i][j] = INF } } for i := 0; i < m; i++ { var p1, p2, val int fmt.Fscan(in, &p1, &p2, &val) grid[p1][p2] = val grid[p2][p1] = val // 无向图 } // Floyd-Warshall for k := 1; k <= n; k++ { for i := 1; i <= n; i++ { for j := 1; j <= n; j++ { if grid[i][k]+grid[k][j] < grid[i][j] { grid[i][j] = grid[i][k] + grid[k][j] } } } } var q int fmt.Fscan(in, &q) for q > 0 { q-- var start, end int fmt.Fscan(in, &start, &end) if grid[start][end] == INF { fmt.Println(-1) } else { fmt.Println(grid[start][end]) } } }
package main import ( "bufio" "container/heap" "fmt" "os" ) const N = 1000 var ( moves [N + 1][N + 1]int dir = [8][2]int{ {-2, -1}, {-2, 1}, {-1, 2}, {1, 2}, {2, 1}, {2, -1}, {1, -2}, {-1, -2}, } b1, b2 int ) /* F = G + H G = 起点到当前节点的代价 H = 当前节点到终点的启发式估计 */ type Knight struct { x, y int g, h int f int } /*************** 优先队列实现 ***************/ type PriorityQueue []Knight func (pq PriorityQueue) Len() int { return len(pq) } // 注意:Go 的 heap 是最小堆,这里要让 f 小的优先 func (pq PriorityQueue) Less(i, j int) bool { return pq[i].f < pq[j].f } func (pq PriorityQueue) Swap(i, j int) { pq[i], pq[j] = pq[j], pq[i] } func (pq *PriorityQueue) Push(x interface{}) { *pq = append(*pq, x.(Knight)) } func (pq *PriorityQueue) Pop() interface{} { old := *pq n := len(old) item := old[n-1] *pq = old[:n-1] return item } /*************** A* 相关 ***************/ // 启发函数:欧氏距离平方(不开根号) func heuristic(k Knight) int { dx := k.x - b1 dy := k.y - b2 return dx*dx + dy*dy } func astar(start Knight) { pq := &PriorityQueue{} heap.Init(pq) heap.Push(pq, start) for pq.Len() > 0 { cur := heap.Pop(pq).(Knight) if cur.x == b1 && cur.y == b2 { return } for i := 0; i < 8; i++ { nx := cur.x + dir[i][0] ny := cur.y + dir[i][1] if nx < 1 || nx > N || ny < 1 || ny > N { continue } if moves[nx][ny] == 0 { moves[nx][ny] = moves[cur.x][cur.y] + 1 next := Knight{ x: nx, y: ny, g: cur.g + 5, // 马走日:1^2 + 2^2 = 5 } next.h = heuristic(next) next.f = next.g + next.h heap.Push(pq, next) } } } } func main() { in := bufio.NewReader(os.Stdin) var t int fmt.Fscan(in, &t) for t > 0 { t-- var a1, a2 int fmt.Fscan(in, &a1, &a2, &b1, &b2) // 清空 moves for i := 1; i <= N; i++ { for j := 1; j <= N; j++ { moves[i][j] = 0 } } start := Knight{ x: a1, y: a2, g: 0, } start.h = heuristic(start) start.f = start.g + start.h astar(start) fmt.Println(moves[b1][b2]) } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/5 9:40:52

STM32下I2C中断方式通信实现深度剖析

深入STM32的I2C中断通信&#xff1a;从原理到实战的完整工程实践在嵌入式系统开发中&#xff0c;我们常常面临这样的窘境&#xff1a;主控芯片已经跑得飞快&#xff0c;但只要一接上几个传感器&#xff0c;整个系统就像被“卡住”了一样——按键不灵、界面卡顿、数据延迟。问题…

作者头像 李华
网站建设 2026/2/5 17:31:59

组织架构优化建议:协同效率评估由TensorRT数据驱动

组织架构优化建议&#xff1a;协同效率评估由TensorRT数据驱动 在AI系统日益复杂的今天&#xff0c;一个看似无关组织管理的技术工具——NVIDIA TensorRT&#xff0c;正悄然成为企业提升研发协同效率的“隐形标尺”。我们常认为组织架构优化依赖于流程再造或绩效考核&#xff…

作者头像 李华
网站建设 2026/2/6 14:46:10

培训课程内容生成:专业知识拆解通过TensorRT智能组织

培训课程内容生成&#xff1a;专业知识拆解通过TensorRT智能组织 在AI模型越来越复杂、部署场景越来越多元的今天&#xff0c;一个训练好的深度学习模型从实验室走向生产线&#xff0c;往往要经历一场“性能炼狱”——推理延迟高、吞吐量低、显存占用大。特别是在边缘设备上跑大…

作者头像 李华
网站建设 2026/2/7 20:19:37

并购尽职调查助手:风险点排查借助TensorRT全面覆盖

并购尽职调查助手&#xff1a;风险点排查借助TensorRT全面覆盖 在一场百亿级企业并购案中&#xff0c;法务团队需要在72小时内审阅超过两万页的合同、协议与合规文件。传统方式下&#xff0c;这几乎是一项不可能完成的任务——人工阅读不仅效率低下&#xff0c;还极易因疲劳导致…

作者头像 李华
网站建设 2026/2/6 8:18:57

跨平台CubeMX安装对比:Windows/Linux/IDE配置差异解析

深入解析 STM32CubeMX 跨平台安装&#xff1a;从 Windows 到 Linux&#xff0c;再到多 IDE 协同实战你有没有遇到过这样的情况&#xff1f;在公司用 Windows Keil 开发得好好的项目&#xff0c;回家想在自己的 Linux 笔记本上继续调试&#xff0c;结果 CubeMX 启动失败、生成代…

作者头像 李华
网站建设 2026/2/6 9:33:03

RK3568 Android14 调试 RTL8211F 千兆以太网 (RGMII)

实战&#xff1a;RK3568 Android14 调试 RTL8211F 千兆以太网 (RGMII) 前言 在 RK3568 的产品定义中&#xff0c;千兆以太网&#xff08;Gigabit Ethernet&#xff09;通常是标配。‌RTL8211F是Realtek&#xff08;瑞昱半导体&#xff09;推出的一款高度集成的千兆以太网PHY芯片…

作者头像 李华