zoukankan      html  css  js  c++  java
  • 第二次实践作业----数独

    第二次作业——个人项目实战:数独


    运行环境: windows10
    编程IDE: Visual Studio 2017 社区版
    编程语言: C++
    Github地址:网址


    1)项目需求

    利用程序随机构造出N个已解答的数独棋盘。
    输入: 数独棋盘题目个数N(0< N<=1000000)
    输出:随机生成N个 不重复 的 已解答完毕的 数独棋盘,并输出到sudoku.txt中


    2)解题思路

    之前对于数独不是很了解,只是通过题目了解了一下数独大致的规则,我最开始的想法
    就是一个一个测试,对于满足要求的数字,写入。但是考虑到有些情况,可能会有1到9
    全部都不满足规定的情况,此时如果一直循环,将会陷入死循环,所以如果碰到有写不
    出数字的情况,应当对前面的数字进行修改,通过不断修改,直到能得出一个正确的情况,
    所以从第一行开始,逐个给予随机数,对于每个随机数,判断是否可以满足条件,如果
    满足,则将其填入,不满足就要从该数字开始,一直加1,如果大于9的话就令其减9,
    如果1到9都不满足条件,将正行删除,从第一列开始重新写随机数,这样可能会得出正确
    的结论。

    遇到的困难:
    主要还是算法有些缺陷,稍微修改就会出现无线循环的情况,改了好几次还是一样,目前好像
    只能得出一种答案,对于多种答案老是会出错,会出现空的情况,而且后面的几个矩阵数字与
    第一个相同。

    • 做过哪些尝试:
      有和同学讨论,也有去百度,自己也想了很久
    • 是否解决:
      还没有解决,也许是因为暑假太久没练,思绪有些混乱,希望自己能通过不断的磨练来强化能力,
      现在的基础还是很薄弱。

    3)设计实现

    通过构造二维数组实现对九宫格的模拟,然后固定下第一个数,接着对下个数进行测试,随机生出一个数,
    如果能成功,就下一个,如果不成功,就将该数加一,超过9的话自动减9,如果1到9都不能成功,那就将正行
    删除。


    4)关键代码说明

    //测试函数,能满足条件返回1,不满足返回0
    int check(int s[9][9], int x, int i, int j)
    {
    	int u, w1, w2,w3,w4,t;
    	for (u = 0; u < 9; u++)
    	{
    		if (x == s[i][u])
    		{
    			return 0;
    		}
    	}
    	for (u = 0; u < 9; u++)
    	{
    		if (x == s[u][j])
    			return 0;
    	}
    	w1 = (i +1)/ 3;
    	w2 = (j+1) / 3;
    	w3 = (i +1)% 3;
    	w4 = (j+1) % 3;
    	if (w3 == 0)
    	{
    		w1 = w1 - 1;
    	}
    	if (w4 == 0)
    		w2 = w2 - 1;
    	for (u = 3 * w1; u < 3 * (w1 + 1); u++)
    	{
    		for (t = 3 * w2; t < 3 * (w2 + 1); t++) {
    			if (x == s[u][t])
    				return 0;
    		}
    	}
    	return 1;
    }
    
    //测试如果成功,则写入,不成功就消除整行
    for (j = s; j < 9; j++)
    			{
    				h = rand();
    				loop = 0;
    				while (1) {
    					if (loop == 0) {		
    						w = h % 9 + 1;			
    						if (w > 9)
    							w = w - 9;
    						c = check(a, w, i, j);
    						if (c == 0)
    							loop = loop + 1;
    						if (c == 1)
    						{
    							a[i][j] = w;
    							break;
    						}
    					}
    					if (loop > 0 && loop < 9)
    					{
    		
    						w = w + 1;
    						if (w > 9)
    							w = w - 9;
    
    						c = check(a, w, i, j);
    						if (c == 0)
    							loop = loop + 1;
    						if (c == 1)
    						{
    							a[i][j] = w; break;
    						}
    
    					}
    					if (loop == 9)
    					{
    						for (int ss = 0; ss < 9; ss++)
    						{
    							a[i][j] = 0;
    						}
    						j = 0;			
    						 break;
    					}	
    				}
    

    6)关于执行力与泛泛而谈

    执行力是将想法转换为行动的能力,一个人执行力的高,就能更多的将想法付诸实践,也就能更好的将事情做好,
    执行力低经常想拖延,无法及时完成任务,而且对于事情的处理不够严谨,所以执行力是一个人成功与否的重要衡量指标。

    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划 .30 50
    · Estimate · 估计这个任务需要多少时间 150 200
    Development 开发 100 120
    · Analysis · 需求分析 (包括学习新技术) 200 180
    · Design Spec · 生成设计文档 40 45
    · Design Review · 设计复审 (和同事审核设计文档) 20 25
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范) 15 20
    · Design · 具体设计 300 350
    · Coding · 具体编码 200 210
    · Code Review · 代码复审 20 20
    · Test · 测试(自我测试,修改代码,提交修改) 20 25
    Reporting 报告 30 35
    · Test Report · 测试报告 15 18
    · Size Measurement · 计算工作量 5 10
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 40
    合计 1190 1360
  • 相关阅读:
    测试开发CICD——Docker—— docker info ——显示 Docker 系统信息,包括镜像和容器数
    测试开发CICD——Docker—— docker version ——显示 Docker 版本信息
    测试开发CICD——Docker—— 容器简单使用
    测试开发CICD——Docker—— 镜像简单使用
    Codeforces Round #430 (Div. 2)
    rvm 安装ruby报错
    BZOJ 2038: [2009国家集训队]小Z的袜子(hose)(莫队算法)
    codeforce round#511
    遥远的国度(换根+树剖)
    如何挖掘网络资源
  • 原文地址:https://www.cnblogs.com/liyuken/p/7502750.html
Copyright © 2011-2022 走看看