遞歸回溯生成和解決數獨問題c/c++


 

數獨

程序地址https://github.com/papicheng/blog/tree/master/%E6%95%B0%E7%8B%AC

一、游戲規則介紹:

數獨是源自18世紀瑞士的一種數學游戲。是一種運用紙、筆進行演算的邏輯游戲。玩家需要根據9×9盤面上的已知數字,推理出所有剩余空格的數字,並滿足每一行、每一列、每一個粗線宮(3*3)內的數字均含1-9,不重復。

  • 程序介紹:
  1. 數獨生成程序(sudokuGenerate.cpp)

生成數獨的算法思想:回溯法,遞歸實現深度優先搜索

函數簡介

  1. void randomFirstRow(char a0[], int n) /*隨機生成第一行*/
  2. int Digit(char a[][COL], int i, int j)/*遞歸填充一個數字*/
  3. void createSudoku(char a[][COL])/*封裝后的數獨生成函數*/
  4. void createStartinggrid(const char a[][COL], char                   b[][COL], int numDigits)/*隨機生成初盤*/
  5. int checkSudoku(const char a[][COL])/*按規則檢查函數*/
  6. void printToFile(const char a[][COL], const char                            filename[])/*打印數獨數組到文件*/
  7. void createSudokuToFile(void)/*批量生成數獨初盤到文件中*/

主要變量

#define MAXNUM 1000   /*數獨游戲個數*/

#define SEED 20171212 /*用於隨機數生成的種子*/

  1. 模擬學生端程序(sudokuStudentEnd.cpp)

解決數獨問題的算法思想:與生成數獨一致。

函數簡介

  1. int checkSudoku(const char a[][COL])/*按規則檢查函數*/
  2. void printSudoku(const char a[][COL])/*打印數獨到屏幕*/
  3. void readFromFile(char a[][COL],

const char filename[])/*從一個文件中讀取數獨*/

  1. int Solve(const char a[][COL],char b[][COL], int i,

int j)/*遞歸解決數獨*/

  1. void solveSudoku(const char a[][COL],

char b[][COL])/*封裝后的解數獨函數*/

  1. 主函數負責遍歷讀取sudoku目錄中的全部數獨初盤,調用解數獨函數,並計算時間,檢查解的正確性,如果出錯立刻輸出錯誤提示並結束程序。最后輸出求解全部數獨問題花費的時間。

主要變量

#define MAXNUM 1000   /*數獨游戲個數,初始階段可以設置成100,即                      只做前100道題*/

  1. 待解決程序(sudokuStudentEnd_toBeSolved.cpp)

內容與模擬學生端程序基本一致,主要做了以下修改:

  1. 刪除readFromFile函數的函數體,考察學生的文件讀寫能力;
  2. 刪除Solve函數;
  3. 刪除solveSudoku函數的函數體。其中:
    1. 參數const char a[][COL]表示初盤二維數組;
    2. 參數char b[][COL]表示解的二維數組。
  • 任務要求:
  1. 老師利用sudokuGenerate.cpp生成包含1000道數獨問題的sudoku文件夾;
  2. 將sudoku文件夾和sudokuStudentEnd_toBeSolved.cpp發布給學生sudoku文件夾和sudokuStudentEnd_toBeSolved.cpp必須在同一目錄下)
  3. 學生需要補充readFromFile函數和Solve函數,完成1000道數獨問題的求解。
  4. 並且,程序的運行時間必須低於模擬學生端程序的時間(200s以內)。
  • 評分標准:
  1. 正確解決數獨問題,並且時間控制在200s以內可以得到滿分。
  2. 用時最短的前三名學生獲得額外的分數獎勵。

程序運行效果圖

 

注:生成的數獨會以TXT文件格式保存,解算數獨的時候需要從txt文件中讀取數據。

程序地址https://github.com/papicheng/blog/tree/master/%E6%95%B0%E7%8B%AC

如果對您有幫助


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM