如何计算两个不同的2d数组中两个值之间的距离

时间:2018-01-07 15:42:07

标签: c# arrays

我有两个bool[5,5]数组,如下所示:

第一

1 1 1 1 1
0 1 0 0 0
0 0 1 1 0
0 0 0 0 0
0 1 0 1 0

第二

0 0 0 0 1
0 1 1 1 0
0 0 0 0 0
0 0 1 1 0
1 0 0 0 0

我要做的是简单计算第一个数组1和第二个数组1之间的距离。我有多次尝试来解决这个问题,但我无法解决这个问题。

结果应如下所示:

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

让我命名数组:first[,]second[,]

有fiew条件:

  1. if (first[i,j] == true && second[i,j] == true) distance[i,j] = 0
  2. if (first[i,j] == false) distance[i,j] = 0
  3. if (first[i,j] == true)然后我必须计算距1最近的second[,]之间的距离,例如。 1first[1,4]中有first[3,4]1中有second[0,4](有错误),所以这意味着distance[3,4] = 3 - 0(因为第二阵列的尺寸)。
  4. 这是计算的主要方法:

    ` static public int findPicture()
        {
            int[,] m = new int[testBitmap.GetLength(0), 
            testBitmap.GetLength(1)];
    
            foreach (var picture in pictures)
            {
                for (int i = 0; i < 5; i++)
                {
                    for (int j = 0; j < 5; j++)
                    {
                        if (testBitmap[i,j] == true)
                        {
                            do
                            {
                                i = i + 1;
                            } while (picture.Value[i,j] != true);
    
                            m[i,j] += 1;
                        }
                    }
                }
    
                var total = 0;
    
                for (int a = 0; a < 5; a++)
                {
                    for (int b = 0; b < 5; b++)
                    {
                        total += m[a, b];
                    }
                }
    
                return total;
            }
    
    
    
            return -1;
        }`
    

    这是我最接近的版本。

    如果你能提出一些建议来解决这个微不足道的问题,我会非常感激。

2 个答案:

答案 0 :(得分:0)

我做这样的事情:

static int[,] BuildDistanceArray(bool[,] array1, bool[,] array2)
{
    if (array1.GetLength(0) != array2.GetLength(0) || array1.GetLength(1) != array2.GetLength(1))
        throw new Exception("Array sizes must match.");

    int[,] distance = new int[array1.GetLength(0), array1.GetLength(1)];

    for (int i = 0; i < array1.GetLength(0); ++i)
    {
        for (int j = 0; j < array1.GetLength(1); ++j)
        {
            distance[i, j] = array1[i, j] ? GetDistance(array2, i, j) : 0;
        }
    }

    return distance;
}

static int GetDistance(bool[,] array, int row, int column)
{
    int maxColumn = array.GetLength(1);
    int distance = 0;

    bool again;
    do
    {
        again = false;

        if (column - distance >= 0)
        {
            if (array[row, column - distance])
                return distance;
            again = true;
        }
        if (column + distance < maxColumn)
        {
            if (array[row, column + distance])
                return distance;
            again = true;
        }

        distance++;
    } while (again);

    return 0;
}

它提供了您正在寻找的结果,适用于任何大小的数组。

答案 1 :(得分:0)

此函数计算转换为int32的2行之间的距离。它是用java编写的,因此需要进行一些小的转换。

int distance(int x, int y) {
    int count = Integer.bitCount(x);
    int totalDist = 0;
    for (int offset = 0; offset < 5 && x != 0; offset++) {

        x = x ^ (x & (y << offset) & 0b11111);
        x = x ^ (x & (y >>> offset));

        int nextCount = Integer.bitCount(x);
        totalDist += (count - nextCount) * offset;
        count = nextCount;
    }
    return totalDist;
}