CF 3A Shortest path of the king

本文介绍了一种简化路径寻找的方法,使用BFS算法解决两个坐标间的最短路径问题,并通过示例代码展示了如何快速计算从一点到另一点的移动步骤。

这题我傻逼还用BFS。看了别人的代码我彻底无语~

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;


int main()
{
    string a,b;
    while(cin>>a>>b)
    {
        int m = abs(a[0]-b[0]);
        int n = abs(a[1]-b[1]);
        cout<<max(m,n)<<endl;
        while(a!=b)
        {
            if(a[0] > b[0]) {cout<<"L";a[0] --;}
            if(a[0] < b[0]) {cout<<"R";a[0] ++;}
            if(a[1] > b[1]) {cout<<"D";a[1] --;}
            if(a[1] < b[1]) {cout<<"U";a[1] ++;}
            cout<<endl;
        }
    }
}


### 最短路径问题与最短简单路径问题的区别 最短路径问题通常是指在一个图中,找到从一个节点到另一个节点的最短路径。图可以是有向图或无向图,边的权重可以是正数、负数或零。最短路径问题的目标是找到一条路径,使得路径上所有边的权重之和最小。最短路径问题在实际应用中非常广泛,例如网络路由、交通导航和社交网络分析等[^1]。 最短简单路径问题则是最短路径问题的一个子集。它要求路径中不能包含任何环路,即路径必须是简单的。换句话说,最短简单路径必须是无环的路径。这是因为在某些图中,可能存在负权环路(negative-weight cycle),即一个环路的总权重为负数。如果路径中允许包含这样的环路,则可以通过多次绕行该环路无限次减少路径总权重,从而导致最短路径不存在。因此,在最短路径问题中,如果图中存在负权环路,则可能无法定义唯一的最短路径。为了避免这种情况,最短简单路径问题明确要求路径不能包含任何环路[^2]。 在大多数最短路径算法中,例如 Dijkstra 算法和 Bellman-Ford 算法,通常假设图中没有负权环路,并且寻找的是最短简单路径。Dijkstra 算法适用于所有边权为非负数的图,而 Bellman-Ford 算法可以处理存在负权边的情况,但不能处理负权环路。这些算法保证找到的路径是简单路径,即不包含任何重复节点的路径[^2]。 ### 示例代码:Dijkstra 算法实现最短简单路径搜索 ```python import heapq def dijkstra(graph, start): # 初始化距离字典,所有节点距离为无穷大 distances = {node: float(&#39;infinity&#39;) for node in graph} distances[start] = 0 # 优先队列 priority_queue = [(0, start)] while priority_queue: current_distance, current_node = heapq.heappop(priority_queue) # 如果当前节点已经处理过,跳过 if current_distance > distances[current_node]: continue # 遍历邻居节点 for neighbor, weight in graph[current_node].items(): distance = current_distance + weight # 如果找到更短路径,更新距离并加入队列 if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(priority_queue, (distance, neighbor)) return distances ``` ### 总结 - **最短路径问题**关注的是在图中找到从一个节点到另一个节点的路径,使得路径的边权总和最小,允许包含环路(但在实际应用中通常避免负权环路)。 - **最短简单路径问题**则进一步限制路径不能包含环路,确保路径是“简单”的,这是大多数最短路径算法所求解的形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值