根据示例对2d阵列进行排序

时间:2016-12-20 23:56:00

标签: c# arrays multidimensional-array

我有很大的时间试图解决这个问题。

它的假设是如何工作的?基本上,用户输入数组的长度和宽度。然后选择他想要阵列上的X的位置。基本上就像扫雷游戏一样。这是一个例子!

Example #1

Input
1. 3 //length
2. 5 //width
3. {1}
4. {1}

Return
{{X, 1, 2},
{1, 2, 3},
{2, 3, 4},
{3, 4, 5},
{4, 5, 6}}

Example #2
1. 5
2. 7
3. {2, 4}
4. {3, 7}

Return
{{3, 2, 3, 4, 5}
{2, 1, 2, 3, 4}
{1, X, 1, 2, 3}
{2, 1, 2, 3 ,4}
{3, 2, 3, 2, 3}
{4, 3, 2, 1, 2}
{3, 2, 1, X ,1}}

EDIT: More easy example

input 3 length
input 3 width

cordinnates {1,1}

Return
{{X , 1 , 2}
 {1 , 2 , 3}
 {2 , 3 , 4}}

编辑:两个块之间的距离是总和 它们的水平和垂直距离(沿对角线方向的移动因此被认为是2的距离)。

这是我的代码!我无法计算如何计算每个数字上X的距离!任何帮助/提示?

public static int[][] getMapGrid(int cityLength, int cityWidth, int XCoordinates, int YCoordinates)
        {
            int contador = 0;
            bool vira = false;
            int[,] city = new int[cityLength,cityWidth];
            Console.WriteLine(city.Length);
            contador = cityWidth;
            city[XCoordinates, YCoordinates] = X;
            for (int a = 0; a < cityLength; a++)
            {
                for (int b = 0; b < cityWidth; b++)
                {
                    if (XCoordinates != b && YCoordinates != a)
                    {
                        if (vira != true)
                        {
                            city[a, b] = contador;
                            contador--;
                        }
                        else
                        {
                            contador++;
                            city[a, b] = contador;
                        }
                    }
                    else
                    {
                        vira = true;
                    }
                    Console.Write(city[a, b]);
                }
                Console.WriteLine();

            }

            Console.ReadLine();
            return null;
        }

1 个答案:

答案 0 :(得分:1)

首先,您的方法返回int[][]。由于您正在处理设置的宽度和高度,因此可以使用方形数组而不是锯齿状数组(即int[,])进行优化。 (我看到你的代码确实使用了一个正方形数组,所以这是一个错字,你应该尽快修复而不是以后。)

其次,您的输入坐标似乎是从1开始的(如左上角坐标为{1,1})。为了您的理智,我建议您使用基于0的索引,因为您使用的数组也将基于0。否则,每次要使用它们时都需要偏移坐标,这会使代码陷入不必要的冗长之中。

第三,您不需要使用复杂的路径查找来确定每个图块与点的距离。每个点都是已知的,地图位于统一的笛卡尔网格上,并且没有一个瓦片引入了诸如障碍物或旅行修改器之类的额外启发式。在这种情况下,您只需对选定图块中的Manhatten Distance进行简单计算即可得到最近的指定点。

public int[,] BuildMap(int w, int h, int[] xList, int[] yList)
{
    if (xList.Length == 0)
        throw new ArgumentException("at least one coordinate pair must be supplied");
    if (xList.Length != yList.Length)
        throw new ArgumentException("coordinate lists must have equal length");

    int[,] map = new int[w, h];

    // Iterate over each map tile
    for (int x = 0; x < w; x++)
    {
        for (int y = 0; y < h; y++)
        {
            // Set storage variable
            int temp = int.MaxValue;

            // Iterate over each point in x/y lists
            for (int idx = 0; idx < xList.Length; idx++)
            {
                // Find the nearest point
                // Distance = |x - px| + |y - py|
                temp = Math.Min(Math.Abs(x - xList[idx]) + Math.Abs(y - yList[idx]), temp);
            }

            // Assign the shortest distance
            map[x, y] = temp;
        }
    }

    return map;
}