用曼哈顿距离模式填充二维数组

Posted

技术标签:

【中文标题】用曼哈顿距离模式填充二维数组【英文标题】:Filling a 2d array with manhattan distance pattern 【发布时间】:2015-10-22 22:57:47 【问题描述】:

我正在尝试为算法做这个作业,他们要求我填充一个二维的 int 数组,如下所示:

4 3 2 3 4
3 2 1 2 3
2 1 0 1 2
3 2 1 2 3
4 3 2 3 4

我在java中试过这个:

int[][] array = new int[5][5];
for (int i = 0; i < array.length; i++) 
    for (int j = 0; j < array[i].length; j++) 
        array[i][j] = Math.abs(i - j);
    

但它给了我这样的东西:

0 1 2 3 4
1 0 1 2 3
2 1 0 1 3
3 2 1 0 1
4 3 2 1 0

这不是一回事,但它是我发现的最接近的。我用java编写了代码,但它可以用任何其他语言......重要的是我认为的“公式”。所以如果你能帮我解决这个问题那就太好了,我试图在网上寻找代码但我没有找到任何东西......谢谢。

【问题讨论】:

首先,您必须能够手动计算数字,然后才能使用计算机程序进行计算。所以每个单元格中的数字是曼哈顿到中心的距离。查看如何计算曼哈顿距离,然后手动计算以确保得到与示例相同的结果,然后将计算结果转换为代码。 【参考方案1】:

看起来您正在寻找到中心的距离。所以你首先要计算这个点:

int center = array.length / 2; //assuming a quadratic array

那么,计算距离就很简单了:

//for ...
array[i][j] = Math.abs(i - center) + Math.abs(j - center);

【讨论】:

【参考方案2】:

这也可以。

int p=N-1;
for(i=0,l=N-1;i<=l;i++,l--)

    for(j=0,k=N-1;j<=k;j++,k--)
    
        arr[i][j]=p;
        arr[i][k]=p;
        arr[l][j]=p;
        arr[l][k]=p;
        p--;
    
    p=N-i-2;

【讨论】:

以上是关于用曼哈顿距离模式填充二维数组的主要内容,如果未能解决你的问题,请参考以下文章

最小化曼哈顿距离

最小化曼哈顿距离

HDU4456-Crowd (坐标旋转处理+hash处理+二维树状数组)

HDU 4311 Meeting point-1(曼哈顿距离最小)

常用距离计算方法:

数据挖掘1-推荐算法入门