首页 > 解决方案 > 在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;
}

但它没有按预期工作。最有可能的是,我犯了一个愚蠢的错误,并且对此视而不见。

标签: c

解决方案


在第 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) 个字,这是无效的操作。


推荐阅读