數獨
程序地址https://github.com/papicheng/blog/tree/master/%E6%95%B0%E7%8B%AC
一、游戲規則介紹:
數獨是源自18世紀瑞士的一種數學游戲。是一種運用紙、筆進行演算的邏輯游戲。玩家需要根據9×9盤面上的已知數字,推理出所有剩余空格的數字,並滿足每一行、每一列、每一個粗線宮(3*3)內的數字均含1-9,不重復。
- 程序介紹:
- 數獨生成程序(sudokuGenerate.cpp)
生成數獨的算法思想:回溯法,遞歸實現深度優先搜索
函數簡介:
- void randomFirstRow(char a0[], int n) /*隨機生成第一行*/
- int Digit(char a[][COL], int i, int j)/*遞歸填充一個數字*/
- void createSudoku(char a[][COL])/*封裝后的數獨生成函數*/
- void createStartinggrid(const char a[][COL], char b[][COL], int numDigits)/*隨機生成初盤*/
- int checkSudoku(const char a[][COL])/*按規則檢查函數*/
- void printToFile(const char a[][COL], const char filename[])/*打印數獨數組到文件*/
- void createSudokuToFile(void)/*批量生成數獨初盤到文件中*/
主要變量:
#define MAXNUM 1000 /*數獨游戲個數*/
#define SEED 20171212 /*用於隨機數生成的種子*/
- 模擬學生端程序(sudokuStudentEnd.cpp)
解決數獨問題的算法思想:與生成數獨一致。
函數簡介:
- int checkSudoku(const char a[][COL])/*按規則檢查函數*/
- void printSudoku(const char a[][COL])/*打印數獨到屏幕*/
- void readFromFile(char a[][COL],
const char filename[])/*從一個文件中讀取數獨*/
- int Solve(const char a[][COL],char b[][COL], int i,
int j)/*遞歸解決數獨*/
- void solveSudoku(const char a[][COL],
char b[][COL])/*封裝后的解數獨函數*/
- 主函數負責遍歷讀取sudoku目錄中的全部數獨初盤,調用解數獨函數,並計算時間,檢查解的正確性,如果出錯立刻輸出錯誤提示並結束程序。最后輸出求解全部數獨問題花費的時間。
主要變量:
#define MAXNUM 1000 /*數獨游戲個數,初始階段可以設置成100,即 只做前100道題*/
- 待解決程序(sudokuStudentEnd_toBeSolved.cpp)
內容與模擬學生端程序基本一致,主要做了以下修改:
- 刪除readFromFile函數的函數體,考察學生的文件讀寫能力;
- 刪除Solve函數;
- 刪除solveSudoku函數的函數體。其中:
- 參數const char a[][COL]表示初盤二維數組;
- 參數char b[][COL]表示解的二維數組。
- 任務要求:
- 老師利用sudokuGenerate.cpp生成包含1000道數獨問題的sudoku文件夾;
- 將sudoku文件夾和sudokuStudentEnd_toBeSolved.cpp發布給學生(sudoku文件夾和sudokuStudentEnd_toBeSolved.cpp必須在同一目錄下);
- 學生需要補充readFromFile函數和Solve函數,完成1000道數獨問題的求解。
- 並且,程序的運行時間必須低於模擬學生端程序的時間(200s以內)。
- 評分標准:
- 正確解決數獨問題,並且時間控制在200s以內可以得到滿分。
- 用時最短的前三名學生獲得額外的分數獎勵。
程序運行效果圖
注:生成的數獨會以TXT文件格式保存,解算數獨的時候需要從txt文件中讀取數據。
程序地址https://github.com/papicheng/blog/tree/master/%E6%95%B0%E7%8B%AC
如果對您有幫助