news 2026/5/12 12:04:28

代码随想录算法训练营第五十三天 | 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/5/10 5:43:17

hal_uartex_receivetoidle_dma工业级串口接收的完整指南

工业级串口接收的终极方案&#xff1a;用HAL_UARTEx_ReceiveToIdle_DMA彻底告别丢包与高CPU占用你有没有遇到过这样的场景&#xff1f;你的STM32正在跑Modbus RTU协议&#xff0c;突然某个读取指令没响应&#xff1b;传感器以115200波特率连续发数据&#xff0c;主控偶尔“吃掉…

作者头像 李华
网站建设 2026/5/12 6:54:16

windows11下载zotero-pdf2zh

前言 安装Python和Zotero&#xff1b;安装uv或者conda二选一&#xff0c;我安装的是conda 建议下载3.12.0版本Python 插件目前支持Zotero 7以及Zotero 8 第一步&#xff1a;安装uv/conda 1.安装uv&#xff1a; # 方法一: 下载脚本安装(推荐) # macOS/Linux wget -qO- htt…

作者头像 李华
网站建设 2026/5/10 7:26:31

python小程序 公安基层民警心理数字画像与救助平台 _03zips22

目录已开发项目效果实现截图开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 python小程序 公安基层民警心理数字画像与救助平台 _03zips22…

作者头像 李华
网站建设 2026/5/10 6:23:15

51单片机最小系统中LED指示灯的设计要点

51单片机最小系统中LED指示灯的设计要点从“点亮第一盏灯”说起&#xff1a;为什么我们要认真对待这个最简单的外设&#xff1f;在嵌入式开发的世界里&#xff0c;“点亮一个LED”常被戏称为程序员的“Hello World”。但别小看这盏小小的灯——它不只是教学演示中的点缀&#x…

作者头像 李华
网站建设 2026/5/10 7:58:45

could not find driver错误解析:驱动开发入门必看

“could not find driver”深度解析&#xff1a;从数据库到内核模块的全链路排错指南你有没有在深夜调试一个看似简单的服务时&#xff0c;突然被一条错误拦住去路——“could not find driver”&#xff1f;它不痛不痒&#xff0c;只一句话&#xff0c;却足以让整个应用启动失…

作者头像 李华