第二次实践作业----数独

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


运行环境: 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
原文地址:https://www.cnblogs.com/liyuken/p/7502750.html