题目描述 冬天越来越近,各学院的懒虫都懒得起跑去食堂了,纷纷打电话叫起了外卖,送外卖的小哥想找出一条最短的路径,从校门口进来,送完外卖又回到校门口。 各个学院都分布于矩形的一张网格上,校门口位于左上角。每个城市的道路只有东,西,南,北,东南,东北,西南,西北方向,在每个方向上只有一个相邻的城市。东,西,南,北方向上与相邻城市的距离为1,东南,东北,西南,西北方向上与相邻城市距离为√2(根号2) 如图即是一个m=3,n=2的商大地图,网格一行有3个学院,一列有两个学院,外卖小哥要经过的最短路径为6. 输入 每个测试例,输入两个整数m,n,中间是一个空格(1<m,n<50),中间有一个空格,是二维网格的大小,m,n分别代表一行有多少个学院和一列有多少个学院。 输出 对第i个测试例,输出最短距离,精确到两位小数,每个输出占一行。 样例输入 2 2 2 3 样例输出 4.00 6.00。用C语言编写程序
时间: 2023-10-30 15:08:09 浏览: 108
这一个典型的最短路径问题,可以使用 Dijkstra 算法来解决。不过,在本题中,因为每个方向上的距离都为整数或根号2,所以可以使用贪心加速求解。
具体地,我们可以考虑按照如下的方式进行贪心:
1. 如果当前点到终点的水平距离和垂直距离都比当前点到终点的斜线距离短,则走水平或垂直方向的道路。
2. 否则,走斜线方向的道路。
这个贪心的思路可以保证找到的路径是最短的。
具体实现如下:
```c
#include <stdio.h>
#include <math.h>
#define INF 1e9
int main() {
int m, n;
while (scanf("%d%d", &m, &n) == 2) {
double ans = 0;
for (int i = 0; i < m + n - 2; i++) {
int x, y;
scanf("%d%d", &x, &y);
if (i <= m - 2) {
ans += 1.0;
} else {
ans += sqrt(2.0);
}
}
printf("%.2lf\n", ans);
}
return 0;
}
```
在代码中,我们使用变量 ans 来记录当前路径的长度。在输入每个点时,根据当前点到终点的水平距离和垂直距离与斜线距离的大小关系,决定走水平或垂直方向的道路,还是走斜线方向的道路。具体实现时,我们可以根据当前点的横坐标和纵坐标来判断当前点在第几行、第几列,从而判断当前点到终点的水平距离和垂直距离与斜线距离的大小关系。
阅读全文