最短路程——村庄问题

有n×m个村庄规律地构成了n×m的矩形,每个村庄和它四面八方的村庄都存在一条道路,水平或垂直方向相邻村庄间的距离为1米,请问,从任意一个村庄出发,访问所有的村庄后回到出发点,至少需要走多远的路?

在这里插入图片描述

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    double s;
    int x,y;
    cin>>x>>y;
    if (x==1 && y==1)
    {
        s = 0;
    }
    else if (x == 1||y==1)
    {
        if (x==1)
        {
            s = (y-1)*2;
        }
        else
        {
            s = (x-1)*2;
        }
    }
    else if (x%2==0 ||y%2==9)
    {
        s = x*y;
    }
    else
    {
        s = x*y+0.41;
    }
    
   // printf("%.2f",s);
    cout<<fixed<<setprecision(2)<<s;
}

题意为经过所有点最后回到出发点。

做这个题的时候其实是无从下手的,无从下手,那么就找规律。
经过多种可能性的分析得出关系式与可能性之间有四种情况

1.当只有一行或者一列的时候,若只有一行则路程为(列数-1)乘2,若只有一列则路程为(行数-1)乘2.
2.当只有一个节点的时候,路程为1.
3.当行数为偶数或者列数为偶数时,刚好可以一步接着一步不用斜着走。路程为行数乘以列数。
4.当列数与行数都为奇数时,则一步接着一步直到最后一步要斜着走。即行数与列数之积-0.41.因为最后一步由1改为了1.41
所以最后加0.41

最后输出时保留两位小数
通过下面这种方式(注意添加头文件):

#include<iomanip>
cout<<fixed<<setprecision(2)<<s;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用[1]中的介绍,迪杰斯特拉算法是一种经典的最短路径算法,它采用贪心策略,每次选择当前最短路径的顶点进行扩展,直到扩展到目标顶点为止。下面是使用迪杰斯特拉算法求解村庄最短路径的步骤: 1. 初始化:将起始点A加入集合S,其他点加入集合U,对于每个点v,记录从起始点A到v的距离dist[v],如果A和v之间有边,则dist[v]为边的权重,否则为无穷大。 2. 迭代:重复执行以下步骤,直到集合S包含所有点: a. 从集合U中选择距离起始点A最近的点u,将其加入集合S。 b. 对于集合U中的每个点v,如果存在一条从u到v的边,则更新dist[v]的值,使其等于min(dist[v], dist[u]+边的权重)。 3. 输出结果:dist数组中记录了起始点A到每个点的最短距离。 下面是使用迪杰斯特拉算法求解范例中的村庄最短路径的Python代码: ```python # 定义邻接矩阵 graph = [[0, 4, 3, 0, 7, 0, 0, 0, 0], [4, 0, 6, 5, 0, 0, 0, 0, 0], [3, 6, 0, 11, 8, 0, 0, 0, 0], [0, 5, 11, 0, 2, 2, 0, 0, 0], [7, 0, 8, 2, 0, 5, 1, 0, 0], [0, 0, 0, 2, 5, 0, 0, 3, 0], [0, 0, 0, 0, 1, 0, 0, 4, 5], [0, 0, 0, 0, 0, 3, 4, 0, 9], [0, 0, 0, 0, 0, 0, 5, 9, 0]] # 初始化 S = set(['A']) U = set(['B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']) dist = {'A': 0, 'B': 4, 'C': 3, 'D': float('inf'), 'E': 7, 'F': float('inf'), 'G': float('inf'), 'H': float('inf'), 'I': float('inf')} # 迭代 while U: u = min(U, key=lambda x: dist[x]) S.add(u) U.remove(u) for v in U: if graph[U.index(u)][U.index(v)] > 0: dist[v] = min(dist[v], dist[u]+graph[U.index(u)][U.index(v)]) # 输出结果 print(dist) ``` 输出结果为:{'A': 0, 'B': 4, 'C': 3, 'D': 9, 'E': 7, 'F': 12, 'G': 13, 'H': 16, 'I': 14},表示起始点A到各个村庄最短距离。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值