如何检查2D数组是否仅在for循环中唯一

时间:2019-06-28 13:42:23

标签: c#

我将如何检查列和行的重复项,并根据是否存在重复项返回true或false。例如

1 2 3

3 1 2

2 3 1

将返回true,因为没有重复项,但是..

1 2 2

3 2 3

2 1 1

将返回false,因为在第2列{2,2,1}中存在重复项。

如何检查行中是否存在重复项,然后检查列中是否存在重复项?

我还需要检查每个数字以与同一行和同一列中的其他数字相符

到目前为止,我只有以下内容:

 for (int row = 0; row < n; row++)
        {
            for (int col = 0; col < m; col++)
            {

                Console.WriteLine("Check for: " + arr[row, col]);
                for (int i = 1; i < arr.GetLength(1); i++)
                {
                    Console.WriteLine("{0} == {1}", arr[row, col], arr[i, col]);
                    if (col != i)
                    {
                        if (arr[row, col] == arr[i, col])
                        {
                            unique = false;
                        }
                    }

                }
                for (int j = 1; j < arr.GetLength(0); j++)
                {
                    Console.WriteLine("{0} == {1}", arr[row, col], arr[row, j]);
                    if (row != j)
                    {
                        if (arr[row, col] == arr[row, j])
                        {
                            unique = false;
                        }
                    }



                }

自2天以来,我一直坚持该建议,我不知道如何对后两个for循环进行正确的检查。 另外我应该只用于循环,并且只有2d数组而不是锯齿状的或HashSets。

谢谢。

大家好,每个人都可以在只使用for循环时从每个singel行和colum中检查每个数字,从而在2d中获得唯一矩阵,因此for和row的for循环应从0开始,并且循环取决于对于行的宽度和最高的列,最重要的是在if语句中,因此当循环开始时,检查检查该列的索引和该行的索引是否与该列的索引相同必须继续,然后转到第二个语句,如果行或列的索引与当前行或列的索引不同,并且行和col的数组等于索引,col或行数组,索引则矩阵不是唯一的。我也将发布代码,以便您可以看到最终结果。多亏所有嘲笑我的人将我引向正确的方向

for (int row = 0; row < arr.GetLength(0); row++)
        {
            for (int col = 0; col < arr.GetLength(1); col++)
            {

                Console.WriteLine("Check for: " + arr[row, col]);
                for (int i = 0; i < arr.GetLength(0); i++)
                {
                    if (i == row)
                    {
                        continue;
                    }
                    Console.WriteLine("{0} == {1}", arr[row, col], arr[i, col]);
                    if (i != row && arr[row, col] == arr[i, col])
                    {
                        unique = false;
                    }
                }
                for (int j = 0; j < arr.GetLength(1); j++)
                {
                    if (j == col)
                    {
                        continue;
                    }
                    Console.WriteLine("{0} == {1}", arr[row, col], arr[row, j]);
                    if (j != col && arr[row, col] == arr[row, j])
                    {
                        unique = false;
                    }
                }

            }
        }

3 个答案:

答案 0 :(得分:1)

我建议使用辅助方法,该方法检查序列中是否存在重复。您可以对行和列使用相同的算法。

        public bool SequenceHasDuplicateSymbols(char[] sequence) {

            char symbolToCheckFor;         
            for (int i = 0; i < sequence.Length; i++)
            {
                symbolToCheckFor = sequence[i];

                for (int j = 0; j < sequence.Length; j++)
                {
                    if (i != j)
                    {
                        if (symbolToCheckFor == sequence[j])
                        {
                            return true;
                        }
                    }
                }
            }

            return false;
        }

答案 1 :(得分:0)

因此,您想检查行和列中是否有重复项,就像数独一样。

我建议您创建一个检查数组中重复项的助手方法,然后对每一行和每一列运行一次此方法。

private bool checkForDuplicateInArray(int[] arr)
    {
        var result = false;
        foreach (int i in arr)
        {
            foreach (int j in arr)
            {
                if (arr[i] == arr[j] && i != j)
                {
                    result = true;
                }
            }
        }

        return result
    }

现在,您只需将2D数组分成行和列,然后使用它来运行方法即可。

        var result = true;

        // rows
        for (int i = 0; i < arr2d.Length; i++)
        {
            int[] arrToCheck = new int[arr2d[i].Length];
            for (int j = 0; j < arr2d[i].Length; j++)
            {
                arrToCheck[j] = arr2d[i][j];
            }
            if(!checkForDuplicateInArray(arrToCheck))
            {
                result = false;
            }
        }

        // columns
        for (int i = 0; i < arr2d[0].Length; i++)
        {
            int[] arrToCheck = new int[arr2d.Length];
            for (int j = 0; j < arr2d.Length; j++)
            {
                arrToCheck[j] = arr2d[j][i];
            }
            if (!checkForDuplicateInArray(arrToCheck))
            {
                result = false;
            }
        }

编辑:假定总体为真,则表示没有重复

答案 2 :(得分:0)

int[,] arr = new int[,] { { 1, 2, 3 }, { 3, 1, 2 }, { 2, 3, 1 } };
// int[,] arr = new int[,] { { 1, 2, 2 }, { 3, 2, 3 }, { 2, 1, 1 } };
int r = arr.GetLength(0), c = arr.GetLength(1);
bool unique = true;

for (int row = 0; row < r; row++)
    for (int col = 0; col < c; col++)
    {
        for (int i = row + 1; i < r; i++)
            if (arr[row, col] == arr[i, col])
            {
                unique = false;
                break;
            }

        for (int j = col + 1; j < r; j++)
            if (arr[row, col] == arr[row, j])
            {
                unique = false;
                break;
            }
    }
Console.WriteLine(unique);

如果您的数组始终是正方形(Col ==行),则可以使用它。一圈就少了。

// int[,] arr = new int[,] { { 1, 2, 3 }, { 3, 1, 2 }, { 2, 3, 1 } };
int[,] arr = new int[,] { { 1, 2, 2 }, { 3, 2, 3 }, { 2, 1, 1 } };

int len = arr.GetLength(0);
bool unique = true;

for (int x = 0; x < len; x++)
{
    for (int r = 0; r < len; r++)
        if (r != x && arr[x, x] == arr[r, x])
        {
            unique = false;
            break;
        }

    for (int c = x + 1; c < len; c++)
        if (c != x && arr[x, x] == arr[x, c])
        {
            unique = false;
            break;
        }
}
Console.WriteLine(unique);