java数独流程图_软件工程个人项目总结-数独

Github项目地址

包含博客

这篇博客将之前的每周所发整合成了一篇

PSP表格

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

60

60

· Estimate

· 估计这个任务需要多少时间

60

60

Development

开发

870

1710

· Analysis

· 需求分析 (包括学习新技术)

120

120

· Design Spec

· 生成设计文档

120

160

· Design Review

· 设计复审 (和同事审核设计文档)

60

30

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

120

60

· Design

· 具体设计

60

120

· Coding

· 具体编码

240

500

· Code Review

· 代码复审

30

120

· Test

· 测试(自我测试,修改代码,提交修改)

120

600

Reporting

报告

150

240

· Test Report

· 测试报告

60

120

· Size Measurement

· 计算工作量

30

30

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

60

90

合计

1080

2010

需求分析

需求

运行一个命令行程序,程序能:

1. 生成不重复的数独终局至文件。

2. 读取文件内的数独问题,求解并将结果输出到文件。

数据建模

将数独分成9个宫进行求解,ER表示如下,因为数独左上角第一块确定,所以将其看作数独的属性。

ec4fefba5107445d68fbac1dff23a5c9.png

功能建模

数据源:用户

数据终点:文件

主要数据流:生成指令、求解指令、数独(待求解),以及终局

主要支持文件:待求解数独文件

主要处理过程:生成终局、求解数独

0层图

e3a57343da6c4e455c7a694544bed099.png

对系统进行求精,划分系统的子系统。

b1a49653b84551bfdf68e288a0e65cdd.png

行为建模

dc535a539a181a9bc6ebe104b8fff5ad.png

解题思路

在最开始拿到题目的时候,想起上学期算法课程学过的回溯算法,决定用会回溯算法进行实现,所以翻看了算法设计的课本和ppt,对回溯算法重新进行了学习。在生成n个不同局面和求解给定数独的思路大致一致,但有在细节处的处理有些不同。首先是生成n个不同的局面,按行进行循环,有一个二维数组保存每个位置的可能数字,从可能数字中随机选一个放在该位置,若该位置找不到可能的位置,则回到上一个,修改上一个位置的解。不断进行回溯,直到所有的位置都合法。若是对给定局面进行求解,则将空白位置用数组记录下来,只对空白位置进行回溯即可。

但在该回溯算法中,搜索时盲目的,效率较低,最差的实现对每个空方格试探所有可能的数字,有大量的时间浪费。并且如果需要生成多个终局时,每一个终局都是通过回溯实现,且生成不同的终局由Random()进行数字选择实现,但实际上Random生成伪随机数,在一定时间会生成相同随机数,无法保证在生成终局数目足够大时,不会产生两个相同的终局。

因为算法效率有很大的改进空间,以及无法保证在n足够大时,所有终局都相异,所以在对代码重构的过程中,引入了排列组合的算法,对原有进行优化。将数独分成9个3X3的小方块,每个小方块是一个宫。

79b821343f58dbe5691093e428d1ec83.png

参考维基百科提供的一个生成终局思路,由第一宫生成其余八个宫。对第一宫中的块进行排列组合即可,因为生成终局时,要求左上角的第一个数为:(学号后两位相加)%9+1,(1+3)%9+1=5,所以左上角为5,且不允许改变。即在第一宫内只有八个块可以移动,有8!=40320种情况,并且在每一宫内(除了第一宫)进行列列变换有3!×3!×3!×3!=1296,第二宫和第三宫可以交换,第四宫和第七宫可以交换有2!×2!=4,总共可以生成209,018,880个终局(大于1,000,000),此方案可行。

对于各种全排列,使用递归的方式实现。

设计实现过程

​  编译器:Intellij IDEA 2019.2

​  语言:java

​  运行环境:JDK 1.8

活动图

e80583a35501ab500e41661d6203cd81.png

顺序图

下面是生成终局的顺序图

e810f453bf2eceb7c3260e9638f07d91.png

下面是求解数独的顺序图

57f2d7b199723ce4de8940ba8f3f081e.png

类图

​  共有三个类,M

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值