作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我写的代码。它应该获取n(最多1000)个城市的名称(最多100000个字符)和坐标,并计算它们之间的欧氏距离。之后,程序应该读取起始城市和要行驶的最大距离,然后打印最短路径和每条可行路径(如果路径<=最大距离,则路径是可行的)。当我打印 dist 数组时,值似乎是正确的,但最终输出完全错误。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int main()
{
int n, i, j, pos = -1, min_pos;
char *temp = malloc(100000 * sizeof(char)), *names[1000], *start;
float *X, *Y, max_dist, *dist[1000], min = 1000;
if(temp == NULL)
return 1;
scanf("%d", &n);
if(n < 2 || n > 1000)
return 1;
X = malloc(n * sizeof(float));
Y = malloc(n * sizeof(float));
if(X == NULL || Y == NULL)
return 1;
for(i = 0;i < n;i++)
{
scanf("%s %f %f", temp, &X[i], &Y[i]);
names[i] = malloc((strlen(temp) + 1) * sizeof(char));
if(names[i] == NULL)
return 1;
strcpy(names[i], temp);
}
scanf("%s %f", temp, &max_dist);
start = malloc((strlen(temp) + 1) * sizeof(char));
if(start == NULL)
return 1;
strcpy(start, temp);
free(temp);
for(i = 0;i < n;i++)
for(j = 0;j < n;j++)
{
dist[i] = malloc(n * sizeof(float));
if(dist[i] == NULL)
return 1;
dist[i][j] = sqrt(powf(X[j] - X[i], 2) + powf(Y[j] - Y[i], 2));
}
free(X);
free(Y);
for(i = 0;i < n && pos == -1;i++)
if(!(strcmp(names[i], start)))
pos = i;
if(pos == -1)
return 1;
for(i = 0;i < n;i++)
if(dist[pos][i] < min && pos != i)
{
min_pos = i;
min = dist[pos][i];
}
printf("Shortest path is %.2f km between %s and %s\n", min, names[pos], names[min_pos]);
for(i = 0;i < n;i++)
if(dist[pos][i] <= max_dist && pos != i)
printf("Feasible path of %.2f km to %s\n", dist[pos][i], names[i]);
return 0;
}
最佳答案
您在第二个 for
循环内为每个 dist[i]
分配内存。我通过初始化 dist
解决了您的问题,如下所示:
dist = calloc(1000, sizeof(float*));
for(i = 0; i < n; i++) {
dist[i] = calloc(n, sizeof(float));
for(j = 0; j < n; j++) {
if(dist[i] == NULL)
return 1;
dist[i][j] = sqrt(powf(X[j] - X[i], 2) + powf(Y[j] - Y[i], 2));
}
}
您的代码存在的问题是某些指令依赖于未初始化的值。每当遇到麻烦时 - 实际上,即使一切运行良好,我也建议这样做 - 使用 valgrind
。使用 -ggdb3
标志编译程序并使用 valgrind 运行它。它应该看起来像这样:
gcc -Wall -Wextra -ggdb3 -o prog prog.c
valgrind ./prog
这将告诉您所有读/写错误、未初始化的值、内存泄漏等。它甚至可以准确地告诉您这些事情发生在哪一行,因此它确实是一个很棒的工具。
最后一点,您还存在一些内存泄漏。以下是释放分配的内存所需的代码:
free(start);
for (i = 0; i < n; i++)
free(dist[i]);
free(dist);
for (i = 0; i < n; i++)
free(names[i]);
关于谁能告诉我为什么这段代码不起作用并且一直打印 0.00 公里作为最短距离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59436076/
Hackerrank - Dijkstra 最短距离 2 我被卡在了 TestCase 7(我唯一失败的一个),我认为这是我的错。我下载了测试用例并检查了我生成的输出。 我执行 git diff,我看
我是一名优秀的程序员,十分优秀!