第二次作业——数独

第二次作业——数独

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安装以及其他准备工作上的时间过长,所以在完成作业时时间相对而言就显得十分紧迫,再加上自身知识储备的不足,所以就显得更加手忙脚乱。因此在接触新知识用于完成作业时,很多时候都是只看关键解释以及相关知识,大概了解一下,无法深入。因此对不少东西都处于一知半解的状态。关于这方面便需要我在空闲时间不断的丰富自己的知识库,需要自己努力了。

posted @ 2017-09-10 22:54  嘀嘀嘀  阅读(241)  评论(4编辑  收藏  举报