北京理工大学2019软件工程个人项目-数独
0. GitHub项目地址
本项目对应的GitHub代码仓库点此进入
2. 解题思路
2.2.2 数独的扩充
仅凭借上述方法构造的数独数目无法满足题目要求,因此我们对数独进行变换来扩充数独数目。
注意到,对于任何数独,都可以任意交换它的 1 ∼ 3 1\sim 3 1∼3行, 4 ∼ 6 4\sim 6 4∼6行, 7 ∼ 9 7\sim9 7∼9行, 1 ∼ 3 1\sim 3 1∼3列, 4 ∼ 6 4\sim 6 4∼6列或 7 ∼ 9 7\sim9 7∼9列而使得交换后的数独仍然是一个合法的数独。
对本项目而言,由于左上角的数字已经确定,所以无法交换第一行和第一列。同时,由于基本数独是通过取遍第一行的所有合法的列的排列产生的,交换数独中的列会导致和其他的基本数独重复。因此,仅能通过:
- 交换2,3行
- 任意交换4~6行
- 任意交换7~9行
来产生新的数独。
据此可以使数独的数目变为原先的: 2 × 3 ! × 3 ! = 72 2\times3!\times3!=72 2×3!×3!=72倍,共计 72 × 40320 = 2903040 ≈ 2.9 × 1 0 6 72\times40320=2903040\approx2.9\times10^6 72×40320=2903040≈2.9×106个数独。显然,我们已经找到了超过 1 0 6 10^6 106个数独,足以满足需求。
2.2 求解数独
对数独的求解较为简单,使用回溯法搜索所有可能结果即可。
3. 软件设计
在软件设计阶段,我们将设计第二章所述算法的程序结构。使用面向对象的方法对其进行分析和建模。分析过程如下。
3.1 用例图
分析需求中的使用者,仅有用户一个。更具需求描述,做出用例图如下。
3.2 类图
需求描述中涉及到的类与对象包括:
- 数独
- 数独求解器
- 数独生成器
使用类图描述他们之间的关系,如下。
3.3 顺序图
对生成数独终局的过程使用顺序图描述如下。
对求解数独的过程使用顺序图描述如下。
4. 软件实现
在软件实现阶段,我们将实现第三章所述程序设计。