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