繁体   English   中英

Java:如何随机化一个没有重复的数组列表

[英]Java: How to randomize an array list without duplicates

import java.util.Random;

public class Sudoku {
  int[][] SquareNumbers = { 
      { 4, 3, 5, 8, 7, 6, 1, 2, 9 }, { 8, 7, 6, 2, 1, 9, 3, 4, 5 }, { 2, 1, 9, 4, 3, 5, 7, 8, 6 },
      { 5, 2, 3, 6, 4, 7, 8, 9, 1 }, { 9, 8, 1, 5, 2, 3, 4, 6, 7 }, { 6, 4, 7, 9, 8, 1, 2, 5, 3 },
      { 7, 5, 4, 1, 6, 8, 9, 3, 2 }, { 3, 9, 2, 7, 5, 4, 6, 1, 8 }, { 1, 6, 8, 3, 9, 2, 5, 7, 4 } };

  Random Digits = new Random(); // random numbers to exchange Rows
  Random HiddenNumbers = new Random();
  int Grid[][] = new int[9][9];

  public int[][] Generator() {
    for (int x = 0; x < Digits.nextInt(); x++) {
      for (int da = 0; da < 3; da++) {

      }
    }

    return SquareNumbers;
  }

  int[][] Hide() {
    for (int i = 0; i < 9; i++)
      for (int j = 0; j < 9; j++)
        Grid[i][j] = SquareNumbers[i][j];

    int Row, Columns, Concealer;

    Concealer = 55 + Digits.nextInt(1);

    for (int i = 0; i < Concealer; i++) {
      Row = HiddenNumbers.nextInt(9);
      Columns = HiddenNumbers.nextInt(9);
      Grid[Row][Columns] = -1;
    }
    return Grid;
  }

  public int[][] getSquareNumbers() {
    return SquareNumbers;
  }

  public void setSquareNumbers(int[][] SquareNumbers) {
    this.SquareNumbers = SquareNumbers;
  }

  private static Sudoku instance = null;

  protected Sudoku() {
    // Exists only to defeat instantiation.
  }

  public static Sudoku getInstance() {
    if (instance == null) {
      instance = new Sudoku();
    }
    return instance;
  }
}

有没有办法随机化它而不是双数组列表,使其像数独游戏一样工作? 因为它在列或行内没有重复项,并且每三乘三较小的网格使用一个数字一次?

生成随机数独谜题的一种方法如下:

  1. 生成一个满足数独游戏约束的随机谜题
  2. 随机交换数字(例如用 3s 替换 2s,用 1s 替换 7s 等)
  3. 随机交换 3 组中的列或行(例如交换第一列和第三列,或第五列和第六列)
  4. 用另一组列随机切换一组 3 列或行。

虽然这些看起来像是不同的谜题,但实际上它们都是各向同性的拉丁方格(即所有等价的,因为它们可以通过重新排序行/列来减少到相同的谜题)。

如果你想要一个更随机的解决方案,这可能已经在这里回答: https : //stackoverflow.com/a/6964044/2471910

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM