一、面向对象设计
用例图
简单的用例图如下
类图
在本次项目中我一共使用了两个类
状态图
以下分别是求生成独终局和求解数独的状态图
二、代码设计
函数关系图
部分代码
以下是生成数独终局部分的代码
void Sudoku::create(int row,int col)
{
//当现在生成的数独终局个数等于要求生成的数独终局个数时,返回
if (this->now_num == this->out_num)
{
return;
}
//生成一个终局
if(row==8&&col==9)
{
//将数独终局导出到要输出的数组中,等待输出到文件
this->IntoOutSu();
//已生成数独终局数加一
this->now_num++;
return;
}
//换行
if(row!=8&&col==9)
{
row++;
col=0;
}
//计算当前行、列、对应的九宫格数
int blo=((row/3)*3)+(col/3);
for(int x=1;x<=9;x++)
{
//数字x将要填充的行、列、九宫格中都还不存在数字x
if ((this->rowmark[row][x] != 1) && (this->colmark[col][x] != 1) && (this->blockmark[blo][x] != 1))
{
//将x填入数独
this->su[row][col] = x;
//标记行、列、九宫格已经存在数字x
SetMark(row, col, x, 1);
//列数+1递归调用函数
this->create(row, col + 1);
//标记行、列、九宫格不存在数字x
//保证回溯后状态也恢复
SetMark(row, col, x, 0);
}
}
//数字x从1到9在当前位置都不合适,先暂时把当前位置填入数字0
this->su[row][col] = 0;
}
求解数独终局部分代码与此处相似,需要跳过不为0的数字。