首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 數獨生成算法:回溯法填充 9x9 九宮格滿足行列宮唯一性

     編輯:程式設計綜合問答

算法核心:回溯 + 隨機化

  1. 按行掃描每個格子。
  2. 從候選數字集合 `{1..9}` 中隨機選一個填入。
  3. 檢查行、列、3x3 宮無衝突。
  4. 衝突則嘗試下一個候選數;候選耗盡則回溯至上一格重試。
  5. 填滿 81 格即得一個合法數獨終盤。

關鍵優化

  • 候選數組原地打亂:`num[8-time]` 與隨機索引交換,已嘗試數字移至尾部,下次不再取到,避免重複隨機。
  • 三重檢查函數:`checkRow`、`checkCol`、`checkBox` 僅檢查相關區域,提前剪枝。
  • 回溯索引計算:非第一列回退列,第一列回退上行末列。

完整代碼結構

public class SudokuGenerator {
    private static final int[][] board = new int[9][9];
    private static final int[] candidates = {1,2,3,4,5,6,7,8,9};
    private static final Random rand = new Random();

    public static int[][] generate() {
        // 填充邏輯見原最佳回答,核心為 generateNum(time) + isCorrect(r,c)
        return board;
    }
    // 輔助方法:checkRow, checkCol, checkBox, generateNum
}

生成題目

終盤生成後,按難度挖空:簡單挖 35-40 個、中等 45-50、困難 55+,並用唯一解驗證器確保單解。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved