【代码随想录算法训练营第六十六天|卡码网97.小明逛公园、127.骑士的攻击】

文章目录

97.小明逛公园

之前的题目都是只有一个出发点和到达点,这道题是有多个起始对,用之前的算法把每一对结果算出来也是可行的,在这里使用Floyd算法。

本质上是一种动态规划,dp数组dp[i][j][k]中的i,j两点在以(1~k)中的点作为中间结点的时候的最小距离,递推公式是dp[i][j][k]=min(dp[i][k][k-1]+dp[k][j][k-1], dp[i][j][k-1]),遍历顺序是k在最外,i,j在内。本质上是因为dp[i][k][k-1]这些中间量还可能是由k更小的时候的组合推断出来的,所以对于所有的i和j,k都应该是从小到大递增推导所有i和j的状态,所以k在最外层。

python 复制代码
n, m = map(int, input().split())
grid = [[[float('inf')] * (n+1) for _ in range(n+1)] for _ in range(n+1)]
for i in range(m):
    u, v, w = map(int, input().split())
    grid[u][v][0] = w
    grid[v][u][0] = w 
q = int(input())
plans = []
for i in range(q):
    start, end = map(int, input().split())
    plans.append([start, end])
    
for k in range(1, n+1):
    for i in range(1, n+1):
        for j in range(1, n+1):
            grid[i][j][k] = min(grid[i][j][k-1], grid[i][k][k-1] + grid[k][j][k-1])


for plan in plans:
    if grid[plan[0]][plan[1]][-1] != float('inf'):
        print(grid[plan[0]][plan[1]][-1])
    else:
        print(-1)

127.骑士的攻击

这道题使用的是Astar算法,是在BFS的基础上进行了一定的优化。普通的BFS也能做但是在广度搜索的时候会有很多的浪费,因此关键就在于每次如何选择朝向目标移动的最近的点。Astar通过计算每个点的预估距离并用小顶堆进行排序,从而使得每次取出来的都是当前可能最小距离的点。在这题使用欧氏距离最合适,总距离是点距离原点的欧氏距离加上到目标点的欧氏距离。

python 复制代码
import heapq

n = int(input())
directions = [[-2, 1], [-1, 2], [1, 2], [2, 1], [-2, -1], [-1, -2], [1, -2], [2, -1]]
Distance = lambda x, y, tar_x, tar_y: (x - tar_x) ** 2 + (y - tar_y) ** 2

class Knight:
    def __init__(self, a1, a2, g=0, f=0, h=0):
        self.x = a1
        self.y = a2
        self.g = g
        self.f = f 
        self.h = h
    
    def __lt__(self, k):
        return self.f < k.f
    
    def __str__(self):
        return f'Knight:{self.x},{self.y}'
    
def bfs(grid, knight, target):
    heap = []
    heapq.heappush(heap, knight)
    while heap:
        cur = heapq.heappop(heap)
        if cur.x == target[0] and cur.y == target[1]:
            return
        for d in directions:
            next_x = cur.x + d[0]
            next_y = cur.y + d[1]
            if next_x < 1 or next_x >= len(grid) or next_y < 1 or next_y >= len(grid[0]):
                continue
            if not grid[next_x][next_y]:
                grid[next_x][next_y] = grid[cur.x][cur.y] + 1
                next_knight = Knight(next_x, next_y)
                next_knight.g = cur.g + 5
                next_knight.h = Distance(next_x, next_y, target[0], target[1])
                next_knight.f = next_knight.g + next_knight.h 
                heapq.heappush(heap, next_knight)
                
for i in range(n):
    a1, a2, b1, b2 = map(int, input().split())
    grid = [[0] * 1001 for _ in range(1001)]
    knight = Knight(a1, a2)
    knight.h = Distance(a1, a2, b1, b2)
    knight.f = knight.g + knight.h
    bfs(grid, knight, [b1, b2])
    print(grid[b1][b2])
相关推荐
Blossom.11824 分钟前
把AI“贴”进路灯柱:1KB决策树让老旧路灯自己报「灯头松动」
java·人工智能·python·深度学习·算法·决策树·机器学习
墨染点香3 小时前
LeetCode 刷题【144. 二叉树的前序遍历】
数据结构·算法·leetcode
cynicme7 小时前
力扣3318——计算子数组的 x-sum I(偷懒版)
java·算法·leetcode
im_AMBER10 小时前
算法笔记 09
c语言·数据结构·c++·笔记·学习·算法·排序算法
凯芸呢10 小时前
Java中的数组(续)
java·开发语言·数据结构·算法·青少年编程·排序算法·idea
寂静山林11 小时前
UVa 1030 Image Is Everything
算法
AI柠檬11 小时前
几种排序算法的实现和性能比较
数据结构·算法·c#·排序算法
weixin_4296302611 小时前
第6章 支持向量机
算法·机器学习·支持向量机
SweetCode11 小时前
C++ 实现大数加法
开发语言·c++·算法
王哈哈^_^11 小时前
【数据集】【YOLO】【目标检测】共享单车数据集,共享单车识别数据集 3596 张,YOLO自行车识别算法实战训推教程。
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测·毕业设计