个人项目——最后篇

一、实现过程:

  首先这个项目我把求解和生成分开写了,生成函数我用回溯法+规则变换来生成终局。先用随机数加回溯生成一个终局,再通过这个终局交换行、列、数字生成1372个终局。这样共需要随机回溯生成1000个左右终局即可。实现过程用了5个函数,分别是dfs回溯生成函数,一个初始化函数,一个随机填数函数,一个变换函数,一个打印函数。dfs函数从1到81号格子填数,然后填的数由随机填数函数决定。一直填满最后判断是否合格,再回溯。再根据这个终局先交换两行,再交换两列最后交换两个数字的方式构造1372个终局。

求解函数我用了跳舞链的数据结构,共用了7个函数,分别是删除列函数、恢复列函数、dfs,初始化函数、读入函数,输出函数,找对应关系函数,关系见流程图。

对于单元测试,我是这样设计的:

1.对于输出到文件的函数,重新打开文件比对结果

2.对于不输出到文件的函数,比对返回值或参数变化是否符合预期

3.对于调用其它函数的函数,因为它调用的函数已有专门的单元测试确保其正确,所以可以只检查不是有调用过所产生的变化是否符合预期。

二、性能分析:

对于求解1000000组空白在30个左右的数独用时30s左右,

可知时间主要是在删除行和恢复行的过程。一开始性能瓶颈是输入输出速度太慢,经过使用字符读入和字符输出后优化了将近20s。

对于生成1000000个终局,用时6s左右,

时间主要是在变换的过程,原本的性能瓶颈在dfs过程以及输出过于慢,通过使用变换规则和字符输出优化。

三、代码说明:

生成程序:

Dfs过程

变换过程

求解程序:

读入函数:

初始化函数:

Dfs求解过程:

四、时间表

原文地址:https://www.cnblogs.com/Lylist/p/8811270.html

时间: 2024-10-24 21:56:43

个人项目——最后篇的相关文章

活动图(Activity Diagram) - 项目分解篇

根据登录用户的情况来进行各模块的操作. 1. 操作员 (1) 列车顺序表 (2) 货车装卸报告(数据处理) (3) 货车装卸报告(查看) 2. 管理员 (1) 密码管理 (2) 查看日志 (3) 车种设置 (4) 延时费设置 (5) 打印通知单(延时费) 其Activity Diagram如下: Rational Rose文件下载:flowChart1.mdl 活动图(Activity Diagram) - 项目分解篇,布布扣,bubuko.com

导出Excel1 - 项目分解篇

我们在所有的MIS系统(信息管理系统)中都能见到他.所以我们把这个通用功能提出来. 项目名称:车辆信息管理系统(中石化石炼) 项目负责人:xiaobin 项目时间:2006.12 - 2007.2 Excel功能模块: 单击事件(Event): procedure EXCELE1Click(Sender: TObject); procedure TfrmMain.EXCELE1Click(Sender: TObject); var colnum,slnum,i:integer; headstr:

Android开源项目第二篇——工具库篇

本文为那些不错的Android开源项目第二篇——开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他. Android开源项目系列汇总已完成,包括: Android开源项目第一篇——个性化控件(View)篇 Android开源项目第二篇——工具库篇 Android开源项目第三篇——优秀项目篇 Android开源项目第四篇——开发及测试工具篇 Android开源项目第五篇——优秀个人和

Android开源项目第一篇——个性化控件(View)篇

本文为那些不错的Android开源项目第一篇——个性化控件(View)篇,主要介绍Android上那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar及其他如Dialog.Toast.EditText.TableView.Activity Animation等等. Android开源项目系列汇总已完成,包括: Android开源项目第一篇——个性化控件(View)篇 Andr

IntelliJ IDEA教程之Andriod项目开发篇(全集)

此教程图文讲解使用IntelliJ IDEA开发Andriod项目,人门篇,希望对初学者有所帮助! IntelliJ IDEA教程之Andriod项目开发篇:准备工作 IntelliJ IDEA教程之Andriod项目开发篇: 新项目设置 IntelliJ IDEA教程之Andriod项目开发篇:现有项目导入设置 IntelliJ IDEA教程之Andriod项目开发篇:理解项目结构 IntelliJ IDEA教程之Andriod项目开发篇:构建应用程序配置 IntelliJ IDEA教程之An

C# Xamarin移动开发项目实战篇

一.课程介绍 在前面阿笨的<C# Xamarin移动开发基础进修篇>课程中,大家已经熟悉和了解了Xamarin移动App开发的基础知识和原理.本次分享课<C# Xamarin移动开发项目实战篇>,阿笨将直接带领大家进入Xamarin for android的实战项目环节,真真体验一下xamarin开发的魅力吧. 由于阿笨学习Xamarin也是"半路出家","赶鸭子上架"的状态,视频教学中关于Xamarin for Android的知识点难免有

ngnix 部署 vue项目-基础篇

ngnix 部署 vue项目-基础篇 标签(空格分隔): docker ngnix vue Dockerfile 目录 基础知识 主要知识点 ###1.基础知识 image container docker 命令 build run rm rmi exec Dockerfile npm 打包vue项目 ###2.主要知识点 Dockerfile image container 简单来讲,Dockerfile构建出Docker镜像,通过Docker镜像运行Docker容器. Dockerfile

小程序入门(0)项目创建篇

已经创建项目的可以看我另一篇讲解 小程序入门讲解 (1)项目结构篇. 官方下载地址 安装后扫描二维码登入. 添加项目 你应该是没有APPID的 选择无APPID 会缺少一项功能后面讲解(目前只发现一项). 好了项目创建好了,有点过分简单了点是不是,但这页面不是我自己创建的就很不舒服,特别想自己创建一个页面,所以去认识项目的结构,我在另一篇讲解的还算清晰.小程序入门讲解 (1)项目结构篇. 讲一下没有APPID 和 有APPID 的功能缺失在哪里,先看图然后自己做一下对比 目前我还没有发现其他的不

Springboot 手动搭建项目 --初始篇

最近一直在学springboot和Cloud,互联网公司现在也更倾向于微服务这一块,前景是一篇光明的,特别是在springboot上开发的Cloud的部分,是一套分布式的整体解决方案,学好这一块至少这几年都很吃香: 既然学习很久,落地实践一下为好: 项目git网址:https://github.com/David-BIQI/manage.git 参照的代码规范:https://github.com/xwjie/PLMCodeTemplate.git (这个是一套能够落地的代码规范,跟着风哥学习很

基于springcloud搭建项目-ribbon篇(三)

这篇文章主要是介绍一下ribbon的用法,我们都知道ribbon是负载均衡,但是却不知道他是怎么样的负载均衡,怎么用,能干嘛? ● 其实,简单的说,Spring Cloud Ribbon是基于Netfilx Ribbon实现的一套客户端 负载均衡的工具 Ribbon是Netfilx发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netfilx的中间层服务连接在一起,Ribbon客户端组件提供一系列完善的配置如连接超时,重试等,简单的说,就是在配置文件中列出Load Balander(简