3 回答

TA貢獻1809條經驗 獲得超8個贊
使用嵌套j循環,您將為每個填充整個第二個維度i,但在k和l循環中,您只檢查當前單元格左上角的網格。您可以放置一個數字兩次,因為您沒有檢查每個以前填充的位置。
如果我們把代碼改成這樣:
for (int k = 0; k < array.GetLength(0); k++)
{
for (int l = 0; l < array.GetLength(1); l++)
{
if (i != k && j != l && array[i, j] == array[k, l])
{
i--;
j--;
break;
}
}
}
然后你消除了那個問題,但你很快發現你得到了一個IndexOutOfRangeException,因為你同時遞減了兩個i& j。這并沒有將您移動到以前的值 - 它跳回一整行并留下一個單元格 - 最終發送i或發送j到-1,這并不好。
如果您想像嘗試那樣做,那么您需要有一種方法可以簡單地移回先前填充的單元格,而不管您所在的行或列如何。
試試這個:
for (int x = 0; x < array.GetLength(0) * array.GetLength(1); x++)
{
array[x % array.GetLength(0), x / array.GetLength(0)] = r.Next(10, 100);
for (int y = 0; y < x; y++)
{
if (array[x % array.GetLength(0), x / array.GetLength(0)] == array[y % array.GetLength(0), y / array.GetLength(0)])
{
x--;
break;
};
}
}
但是,這不是很有效。試試這個:
var values = Enumerable.Range(10, 90).OrderBy(_ => r.Next()).ToArray();
for (int x = 0; x < array.GetLength(0) * array.GetLength(1); x++)
{
array[x % array.GetLength(0), x / array.GetLength(0)] = values[x];
}

TA貢獻1806條經驗 獲得超8個贊
所以,首先,這似乎效率低下。不知道你為什么要這樣做,但話又說回來,不知道原因??雌饋硐褚粋€編程任務。
我猜,你需要某種雙重休息。當您中斷查找匹配項時,您不會中斷到“k”for 循環,因此即使您找到了一個匹配項,您仍會繼續查找匹配項。嘗試設置一個布爾值來表示已找到,然后在 k 的 for 循環的條件中使用它。這將打破它,讓你重新開始 i 和 j 的外部循環。
即使那樣,它也不會起作用,因為您不加選擇地減去了 i 和 j。因此,如果您位于位置 1,2,您將跳回到 0,1 而不是 1,2。所以你需要減去j,如果它降到0以下,然后從i中減去并將“array.GetLength(1)”添加到j。

TA貢獻1744條經驗 獲得超4個贊
此解決方案取決于HashSet包含唯一元素的屬性。它有一個Add
方法,false
當我們嘗試添加現有元素時返回。
Random r = new Random();
int[,] array = new int[10, 8];
var usedValues = new HashSet<int>();
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
int uniqueValue;
while (true)
{
uniqueValue = r.Next(10, 100);
if (usedValues.Add(uniqueValue)) break; // It is unique indeed
// It is not unique, try again.
}
array[i, j] = uniqueValue;
}
}
當可接受的唯一值范圍較大時,上述解決方案更適用。在這種特定情況下,范圍非常?。?0-99),@Enigmativity 提供的解決方案更可取。
- 3 回答
- 0 關注
- 291 瀏覽
添加回答
舉報