我将如何检查列和行的重复项,并根据是否存在重复项返回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;
}
}
}
}
答案 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);