北京理工大学2019软件工程个人项目-数独-All_in_one

本文详细介绍了如何实现一个能生成数独终局并求解数独问题的程序,包括数独的生成方法、求解策略、软件设计、测试和性能改进。通过生成数独的通法和扩充策略,确保生成足够数量的不重复数独,使用回溯法解决数独,并通过面向对象设计进行软件实现和测试。
摘要由CSDN通过智能技术生成

0. GitHub项目地址

本项目对应的GitHub代码仓库点此进入

1. PSP 表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
- Estimate - 估计这个任务需要多少时间 20 25
Development 开发
- Analysis - 需求分析(包括学习新技术) 150 70
- Design Spec - 生成设计文档 90 120
- Design Review - 设计复审(和同事审核设计文档) - -
- Coding Standard - 代码规范(为目前的开发制定合适的规范) - -
- Design - 具体设计 90 60
- Coding - 具体编码 300 720
- Code Review - 代码复审 90 60
- Test - 测试(自我测试,修改代码,提交修改) 240 180
Reporting 报告
- Test Report - 测试报告 60 50
- Size Measurement - 计算工作量 30 20
- Postmortem & Process Improvement Plan - 是否总结,并提出过程改进计划 30 30
Total 总计 1100 1335

2. 解题思路

本题要求实现实现一个能生成数独终局并独立求解数独问题的程序。
主要需求如下:

  1. 能够生成数独终局
  2. 能够独立求解数独

2.1 生成数独终局

根据项目要求,需要生成 1 0 6 10^6 106个不重复数独。由于需求并未要求数独的难度,故可以考虑使用数独的特性来寻找生成简单而不同的数独的通法。

2.1.1 生成数独的通法

不妨设数独的第一行为: a , b , c , d , e , f , g , h , i a,b,c,d,e,f,g,h,i a,b,c,d,e,f,g,h,i
A = { x ∣ 1 ≤ x ≤ 9    a n d    x ∈ N } A= \left\{x|1 \leq x \leq 9 \; and \; x \in N \right\} A={ x1x9andxN}
B = { x ∣ 0 ≤ x ≤ 8    a n d    x ∈ N } B= \left\{x|0 \leq x \leq 8 \; and \; x \in N \right\} B={ x0x8andxN}
我们可以按照如下方式构建一个合法的数独:

令数独的k行为第一行向右移动 f ( k ) f(k) f(k)列。故: f ( 1 ) = 0 f(1) = 0 f(1)=0
由于数独每一列必须取到 a a a i i i中的所有值,故 f ( k ) f(k) f(k)是从 A A A B B B双射函数
同时,由于每个 3 × 3 3\times3 3×3的 子网格也包含 a a a i i i中的所有值,即在 3 × 3 3\times3 3×3的小方格中不能出现重复数字,要求:
f ( 2 ) ≥ f ( 1 ) + 3 f(2) \geq f(1) + 3 f(2)f(1)+3, f ( 3 ) ≥ f ( 2 ) + 3 f(3) \geq f(2) + 3 f(3)f(2)+3, f ( 3 ) ≤ f ( 1 ) + 6 f(3) \leq f(1) + 6 f(3)f(1)+6
f ( 5 ) ≥ f ( 4 ) + 3 f(5) \geq f(4) + 3 f(5)f(4)+3, f ( 6 ) ≥ f ( 5 ) + 3 f(6) \geq f(5) + 3 f(6)f(5)+3, f ( 6 ) ≤ f ( 4

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值