zoukankan      html  css  js  c++  java
  • 第二次作业——数独

    第二次作业——数独

    github地址:https://github.com/llsz/shdoku_text

    项目需求

    利用程序随机构造出N个已解答的数独棋盘 。

    输入

    数独棋盘题目个数N

    输出

    随机生成N个 不重复 的 已解答完毕的 数独棋盘,并输出到sudoku.txt中,输出格式见下输出示例。

    [2017.9.4 新增要求] 在生成数独矩阵时,左上角的第一个数为:(学号后两位相加)% 9 + 1。例如学生A学号后2位是80,则该数字为(8+0)% 9 + 1 = 9,那么生成的数独棋盘应如下(x表示满足数独规则的任意数字)

    困难

    1、老实说在最初接触时完全没有思路
    2、自控能力差,在最初几天的寻求解决办法查资料的过程中,极易走神
    4、下载VS2015时碰到不少麻烦
    3、代码前期功能均已实现,但在实现命令行功能时出现问题

    目前状态
    大部分功能均已完成,但尽管试过多种方法,并借助网络以及询问他人,但命令行功能仍为实现。为此,我曾尝试过使用ayoi函数以及模仿他人代码,但仍无法成功。猜测可能是电脑某些配置出了问题

    解题思路

    我的想法便是通过深度搜索一步步得出数独每个位置的可能值。因为该题并非解开一个给定一定数值的数独而是随机生成多个数独。在考虑过自身能力后我选择暴力解决,即第一行生成1~9任意随机数,其后通过搜索每一位置可能值得到数独。

    设计实现

    在实现代码的过程中,经过长时间的思考改进,最终决定使用四个函数:随机生成第一行函数void start(int t);检查(i,j)是否符合规则函数bool Sudoku_check(int i, int j, int key);以及用于搜索的函数bool Sudoku_dfs(int i, int j);还有输出函数int Sudoku_out();
    关键代码

    void start(int t)
    {
    	srand(t);  /* 产生random_shuffle的随机数种子 */
    	for (int i = 0; i<9; ++i)
    		for (int j = 0; j <9; ++j)
    			num[i][j] = 0;
    	num[0][0] = 2;   //左上角的第一个数为:(学号后两位相加)% 9 + 1   --学号后两位为27
    	num[0][1] = 1;
    	for (int i = 2; i <9; i++)
    		num[0][i] = i + 1;
    
    	random_shuffle(&(num[0][1]), &(num[0][8]));  /* 第一行随机排列产生 */
    
    }
    bool Sudoku_dfs(int i, int j)
    {
    	for (int k = 1; k < 10; k++) {
    		if (Sudoku_check(i, j, k))
    		{
    			num[i][j] = k;
    			if (j < 8)
    			{
    				if (Sudoku_dfs(i, j + 1))
    					return true;
    			}
    			else {
    				if (i < 9)
    				{
    					if (Sudoku_dfs(i + 1, 0))
    						return true;
    				}
    				else
    					return true;
    			}
    			num[i][j] = 0;
    		}
    	}
    	return false;
    }
    

    测试运行

    例:输入3

    PSP表格

    psp2.1 Personal Software Pr0cess stage 预估耗时 实际耗时
    Planning 计划
    ·Estomate 估计任务需要时间 15 20
    Development 开发
    ·Analysis 需求分析(学习新技术) 60 80
    ·Design Spec 生成设计文档 10 15
    ·Design Review 设计复审 0 0
    ·Coding Standard 代码规范 0 0
    ·Design 具体设计 15 20
    ·Coding 具体编码 390 450
    ·code review 代码复审 30 30
    ·Text 测试(自我测试,修改代码,提交修改) 120 150
    Reporting 报告
    ·Text Report 测试报告
    ·Size Measurement 计算工作量
    ·postmortem&Process 事后总结 30 80
    合计 670 845

    个人对执行力、泛泛而谈的理解

    执行力最直观的意思便是一个人对于要做的一件事情的执行力度、速度快慢、成果等的综合,以及目标的完成度。即能否把一件事做好和一个人的执行力有很大的关系。在我看来,一个人执行力强与弱和他的自控能力、思想观念、能力及经验都有很大程度的关系。而我现在执行力就处于一种较弱的水准。就如这次作业,由于自身知识储备不够的原因,在一开始就遇到了很多困难,因此在查资料及学习新知识上就花费了不少时间。即使如此,还是有不少问题虞待解决。此外由于自控能力弱的原因,更是拉长了作业的完成时间,在很大程度上影响了我的效率。这些地方都需要我改进。
    至于泛泛而谈,即浮于表面,没有深入研究。我觉得其实自己这次作业就是个典型的例子。由于这次作业时间只有一星期,再加上我耗费在前期如VS安装以及其他准备工作上的时间过长,所以在完成作业时时间相对而言就显得十分紧迫,再加上自身知识储备的不足,所以就显得更加手忙脚乱。因此在接触新知识用于完成作业时,很多时候都是只看关键解释以及相关知识,大概了解一下,无法深入。因此对不少东西都处于一知半解的状态。关于这方面便需要我在空闲时间不断的丰富自己的知识库,需要自己努力了。

  • 相关阅读:
    Ckeditor(4.5.5) language 语言切换
    利用array_slice进行手动分页
    PHP API 接口访问之签名验证
    mysql外键的一些总结
    缺货置顶功能(类似功能可参考)
    [Exchange2013] 无法正常发送存入草稿箱 或者 只能发不能收
    [Exchange]2个不同域之间互发邮件
    [Citrix NetScaler] 简述
    [转载] cookie、JS记录及跳转到页面原来的位置
    [XenServer] XenServer修改IP 以及 root密码
  • 原文地址:https://www.cnblogs.com/llsz/p/7502767.html
Copyright © 2011-2022 走看看