遞歸回溯生成和解決數獨問題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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章