zoukankan      html  css  js  c++  java
  • 第一次作业(这里有个正经微笑)

    地址传送门

    PSP

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

    心路历程

    看到这个题目,我的心有的难受,仿佛要回到数据结构的时代,那是噩梦之一啊,不过看到deadline,毕竟第一生产力,已经没有空彷徨和惆怅了,二话不说开始思考,自己的思路开始也是产生一个随机数,然后一个个填下去,每次填的时候通过一个check函数检查一下正确性。于是上百度了,
    作为一个看到100行代码以上头就痛的可怜孩子,这次我忍痛看了10篇以上关于数独生成的算法,主要思路是某种排列组合和回溯,排列组合听起来没什么很有意思,我选择回溯。主要用到以前数据结构学习到的DFS,很重要想要使用这个的原因也在于自己掌握的并不好,想通过这次项目的实践加深对其的理解。主要思想,相信老师有看我的代码,应该可以一眼看出来,但我还是试着在下文去描述下。

    设计实现

    代码部分主要分为三个函数,check检查部分,即每填入一个数,都进行check,符合条件将其存入b数组,b数组即为可行数的存储数组。还有最核心的DFS函数,即从第一个数开始,如果数符合条件,即开始递归。最后就是输出文件的函数,就是传统套路了。

    关键代码

    bool DFS(int n)
    {
    	if (n > 80) {
    		return true;
    	}//全部遍历完,即结束
    	int j = 8;
    	int k = 0;//可行数的个数
    	int b[9];//存可行的数
    	num[n / 9][n % 9] = 0;
    	for (int i = 1; i <= 9; i++)
    	{
    		if (Check(n, i) == true) b[k++] = i;
    
    	}//将所有可行的数存入b数组
    	if (k == 0) {
    		num[n / 9][n % 9] = 0;
    		return false;
    	}//没有满足的数,返回错误
    	else
    	{
    		k++;
    		do
    		{
    			k--;
    			if (k == 0) {
    				num[n / 9][n % 9] = 0;
    				return false;
    			}
    			int pos = rand() % k;
    			num[n / 9][n % 9] = b[pos];
    			swap(b[pos], b[k - 1]);
    		} while (!DFS(n + 1));//下一个数不存在,即往下递归
    		return true;
    	}
    }
    

    算法主要的思想是,分为DFS和输出和检验三种,首先将9*9的二维数组全置为0,采用时间随机数放入1-9,维护两个一维数组,a数组是一个是简单粗暴的1-9,另一个b数组是用来存储可行数字的数组,进入某一格的时候,首先检验一遍,用随机数做数组的位置进行随机,然后将可行的位置存到b数组,将这个数组从第一个位置填入九宫格中,一层层递归往下,如果不能进行,返回上一层的时候,将b数组第一个元素与最后一个元素调换位置,并将长度--,这时就能保证再次填入的数字不重复。通过这样递归,最终到第81个位置的时候,即可完成。然后进行文件输出与命令行的调整即可。

    测试运行




    目前主要存在的问题是输出占用太多时间,如图所示,解决的方法还在探索,目前只是将c++转化为C的输入输出,速度竟然真的提高了一倍,其他关于算法本身的实质性问题就无法解决了,不过每次入睡前都瞑目思考,效果特别好。

    关于执行力与泛泛而谈(纯属为了捞分)

    个人觉得,这个问题与本身的性格与对这个项目(甚至这个专业)的兴趣有关,与我本身来说,DEADLINE真的是第一生产力,时间对于我来说真的太紧了,前五天开始着手本次代码,并且了解到性能分析、单元测试等许多内容,但是真正实践起来可能还是初步,今后肯定会更加熟悉。泛泛 而谈这个词其实可以对应到我的第一篇博客,很多东西并非刻意为之,只是无法给出确定的东西,当然,这个问题我应该反省,可能对自己不够严格,不,就是不够严格。我相信柯老师说的话了,这门课坚持下去,真的有可能成为一名合格的程序员。

    遇到的困难和解决方法

    主要还是在代码算法本身,经过百度查资料,和大神舍友的提醒,慢慢找到正确的解决方法。还有一个不可避免的就是,时间的安排。目前主要两块时间,一个是早上8点到12点,和晚上十点后,我发现一个人的时候更容易静下心打代码,开学之后,一定要给自己留下更多的整段时间来解决问题。

    关键代码和设计说明

    在上文已提到

    学习进度条

    本周累计100行代码,复习了vs2015,、github、回溯思想。

  • 相关阅读:
    samba 4.11 or newer version enable SMB1
    linux下使用mv将递归的文件从多个目录移动到一个目录中
    【转载】修改Windows下键盘按键对应功能的一些方案
    ACR122U读卡器在win7以上系统使用过程中的设置项
    恢复Chrome 78以上版本的地址栏https和www显示
    配置sshd的免密码登录
    1234
    MarkDown 语法记录
    语法测试
    解决 Linux grep 不高亮显示
  • 原文地址:https://www.cnblogs.com/Dylan110/p/7500334.html
Copyright © 2011-2022 走看看