行和列中没有重复项的二维数组

2D Array with no duplicates in rows and columns

我需要构建一个 8x8 数组,其中填充 0 到 7 的数字,但行和列中不能有任何重复项。另外,生成的序列应该是随机的。

例如:

0 1 2 3 4 5 6 7
1 2 3 4 5 6 7 0
2 3 4 5 6 7 0 1
3 4 5 6 7 0 1 2
4 5 6 7 0 1 2 3
5 6 7 0 1 2 3 4
6 7 0 1 2 3 4 5
7 0 1 2 3 4 5 6

是一个有效的数组,因为任何行/列中都没有重复项。

我从这段代码开始,但是当它用完可供选择的可能数字时,它显然会崩溃。

int[][] array = new int[8][8];
List <Integer> numbers = new ArrayList<Integer>(Arrays.asList(0,1,2,3,4,5,6,7));
Collections.shuffle(numbers);

//populate first row
for(int i = 0; i <= 7; i++) {
   array[0][i] = numbers.get(i);
}

//populate the rest of array
for(int i = 1; i <= 7; i++) {

   Collections.shuffle(numbers);

   for(int j = 0; j <= 7; j++) {
      Deque<Integer> numbersToPickFrom = new ArrayDeque<>(numbers);

      //Remove duplicates from above
      for (int k = 0; k < i ; k++)
         numbersToPickFrom.remove(array[k][j]);

      //Remove duplicates from left
      for (int k = 0; k < j ; k++)
         numbersToPickFrom.remove(array[i][k]);

      array[i][j] = numbersToPickFrom.pop();
      System.out.print(array[i][j]+" ");
   }

   System.out.print("\n");

}

输出:

3 4 5 7 6 0 2 1 
4 5 6 2 0 7 3 Exception in thread "main" java.util.NoSuchElementException
    at java.util.ArrayDeque.removeFirst(ArrayDeque.java:280)
    at java.util.ArrayDeque.pop(ArrayDeque.java:517)
    at kamisado_logic.Board.createRandomSquares(Board.java:209)
    at kamisado_util.ThreadDriver.main(ThreadDriver.java:17)

我觉得我的方法与最好的方法相去甚远,如有任何提示,我们将不胜感激。

您的问题与生成数独网格非常相似,只是删除了一些约束:

  • 你只有 8 行和列,而不是 9
  • 您不必在子方块中具有唯一值

你可以看看数独的生成算法,去掉不需要的部分。 这里有一些开始的提示:

  • (算法很多的论文)
  • (分享伪代码的会员)