需求分析与建模
本项目的需求比较简单明了,只需要用户在命令行输入参数来选择生成数独或求解数独。大致分为三个主要模块:主函数、生成数独、求解数独。
下面进行简单的建模:
功能建模
行为建模
设计实现步骤
基本流程:
主函数
将主函数放在main.cpp中,主函数是对整个流程的控制,包括对命令行输入参数的判断分析,传递参数,调用相应函数。
1、判断参数输入是否合法。
2、若第二个参数为-c,则判断第三个输入参数是否为1到1000000之间的数字,若输入合法,则调用生成数独函数generate_sudoku()并传递相应参数。
3、若第二个参数为-s,则调用求解数独函数solve_sudoku()。
生成数独函数
(1)函数initialize(int first[])使用模板和数独第一行数据来生成一个完整的初始数独终局,生成的初始终局存储在now[]中。
(2)函数Write(char * output)将output中的数据写入sudoku.txt的文件中,output是用来存储所有生成的数独终局的数组。
(3)函数generate_sudoku(int num)用来生成数独终局
函数中数组first用于存储第一行的内容,通过next_permutation函数对第一行进行全排列以生成不同的第一行数据;数组row_order规定行的顺序,同样由next_permutation进行排列。
求解数独
(1)函数setnum(int row, int col, int num, int flag),将row行col列上标记上数字num或取消标记数字num,flag用来区分是进行标记还是取消标记。
(2)函数judge(int row, int col, int num)用来判断row行col列是否可以标记为数字num。
(3)函数print_output()将已经解决的终局放入数组s_output中。
(4)函数dfs(int s,int count)用来进行回溯搜索。
(5)函数solve_sudoku(string path)是求解数独的主体结构。
其中文件预处理中,将文件中‘0’的位置放入一个单独数组中代表需要求解,其他已经填好的数据进行setnum()。