c - 在C中的矩阵中查找距离
问题描述
我有一个数字矩阵,想要找到每个项目与其最远的非零邻居(四个方向)的距离。我想出了这个主意
#include <stdlib.h>
#include <stdio.h>
int min(int a, int b, int c, int d)
{
int e = a < b ? a : b;
int f = c < d ? c : d;
int r = e < f ? e : f;
return r;
}
int main()
{
int width = 50;
int height = 50;
int points[width][height];
int distances[width][height][5]; // 0 left 1 right 2 bottom 3 top 4 min
// adding some random values, zero and non-zero
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
points[x][y] = rand() % 100;
}
}
// scanning in four direction to check if the previous neighbour exists
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
if (points[x][y] > 0)
{
distances[x][y][0] = distances[x - 1][y][0] > 0 ? distances[x - 1][y][0] + 1 : 1;
}
}
for (int x = width - 1; x >= 0; x--)
{
if (points[x][y] > 0)
{
distances[x][y][1] = distances[x + 1][y][1] > 0 ? distances[x + 1][y][1] + 1 : 1;
}
}
}
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
if (points[x][y] > 0)
{
distances[x][y][2] = distances[x][y - 1][2] > 0 ? distances[x][y - 1][2] + 1 : 1;
}
}
for (int y = height - 1; y >= 0; y--)
{
if (points[x][y] > 0)
{
distances[x][y][3] = distances[x][y + 1][3] > 0 ? distances[x][y + 1][3] + 1 : 1;
}
}
}
// finding the minimum of four distances
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
if (points[x][y] > 0)
{
distances[x][y][4] = min(distances[x][y][0], distances[x][y][1], distances[x][y][2], distances[x][y][3]);
printf("%d %d %d %d %d %d %d \n", x, y, distances[x][y][0], distances[x][y][1], distances[x][y][2], distances[x][y][3], distances[x][y][4]);
}
}
}
return 0;
}
但它没有按预期工作。最有可能的是,我犯了一个愚蠢的错误,并且对此视而不见。
解决方案
在第 34 行:
if (points[x][y] > 0)
{
distances[x][y][0] = distances[x - 1][y][0] > 0 ? distances[x - 1][y][0] + 1 : 1;
}
当x
为零时,您在距离地址之前最多引用 250 (50 * 5) 个字,这是无效的操作。
推荐阅读
- flutter - 如何防止单向滚动?
- docker - golang docker time lib无法正常工作
- java - 使用正则表达式替换所有不是数字、逗号或点的字符
- python - 如何添加'|' 使用python在我的excel表中单词末尾的每个单元格中输入管道
- python - Python 脚本打开新的 VTY 行。不希望这种行为
- cuda - 获取指向设备上一维连续数组的特定元素的指针
- azure - 将 Azure 应用服务移动到虚拟网络
- c++ - 有效地展平结构数组
- c++ - std::shared_timed_mutex 何时比 std::mutex 慢,何时(不)使用它?
- gradle - 在单个 build.gradle 中支持多个 gradle 版本