第二次实践作业----数独
第二次作业——个人项目实战:数独
运行环境: 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 |