软件工程基础—个人项目

软件工程个人项目——数独问题求解

 

项目github地址:https://github.com/Ch2ng/aa.git

解题思路

 

程序的需求有两个:

 

  1. 生成给定数量的数独终局
  2. 求解给定的数独

 

关于求解的思路很容易想到,就是回溯搜索+优化剪枝。

 

如果是从左往右、从上到下依次搜索每个格子,这样会使需要求解的数量变得比较大。数独每个格子的数字是被行、列、格所限制的,人在玩的时候,总是会根据其他数字的限制先填一个格子。由此可以得到一个剪枝的思路,每当要决定搜索哪个格子的时候,选择可行解最少的。直觉上来说,搜索时每一步的可行解都是最少的,每一次尝试之后,试填的格子周围的可行解数量也都会减少,使得后面的可行解数量也变小。这样就加快了搜索的速度。

 

对于规定生成的终局左上角为特定数字,由于是求解生成,所以只要初始局满足要求,那生成的所有终局都是满足要求的。

 

这样的选择是因为不管是随机产生、还是通过矩阵变换或者其它,当需要生成的矩阵数目比较多的时候,可能碰到后期出解的概率减少,而且判重的时间消耗会增加这样的问题。而回溯暴力寻找的好处此时就体现:

  • 不需要判重。因为按顺序找出来的肯定是不同解
  • 时空复杂度相对都不错。而且稳定性好,不会有随机化带来的不均衡问题
  • 编程复杂度低

 

实现过程

 

实现

 

代码的整个 设计如下:

 

SudokuBoard 类:封装了数独棋盘,方法包括:棋盘构建,寻找可行解,计算可行解数量,寻找最小可行解格子

 

SudokuSolver 类:求解器类,方法包括:验证棋盘,深度优先搜索,生成棋盘,文件读取,求解数独

 

核心的算法是搜索:

 

  1. 计算所有格子的可行解数量
  2. 如果没有可求解的,则回溯;如果获得一个解,则保存起来,达到一定数量后退出
  3. 寻找可行解最少的格子作为待解格子
  4. 获取该格子的所有可行解
  5. 对于格子的每一个可行解,设置棋盘为该可行解
  6. 递归搜索(回到1)   

 

 

PSP

 

 

 

转载于:https://www.cnblogs.com/chengshenghao/p/8763021.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值