代码改变世界

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

2017-09-10 21:57  麦哈狼  阅读(355)  评论(2编辑  收藏  举报

项目需求

利用程序随机构造出N个已解答的数独棋盘 。

输入

数独棋盘题目个数N(0<N<=1000000)

输出

随机生成N个不重复的已解答完毕的数独棋盘,并输出到sudoku.txt中,在生成数独矩阵时,左上角的第一个数为:(2+9)%9+1=3。

遇到的困难及解决方法

困难描述

一看到题目,整个人都不好了,发呆了几分钟之后接受了这个事实,开始想怎么做,可是一点思路都没有,不知从何下手。

做过哪些尝试

之后百度了解了数独的规则和解题方法,也看了一些解数独的算法,结合这次题目想了一个方法。

是否解决

怎么说呢,解决了一部分,没有全部解决

有何收获

解题思路

在百度上看了一些解数独的算法之后,有了一个思路。数独左上方第一个固定为3,接下来的每个格子随机用1~9去尝试,然后验证每行、每列、每个九宫格是否有重复的数字,直到每行、每列、每个九宫格都没有重复的数字。

关键代码or设计说明

整个代码,主要包括三个函数check、output和DFS,check函数用于检查每行、每列、每个九宫格是否有重复的数字,DFS函数用于产生每个九宫格的数字,output函数用来输出并将数独终盘打入文件。

贴出你认为的关键代码或者设计图,并进行解释

产生每个九宫格的数字

for (int i = 1; i <=9; i++)
        {
            /* 满足条件时填入数字 */
            if (Check(n, i) == true)
            {
            	 num[n/9][n%9] = i;
                /* 继续搜索 */
                DFS(n+1);
                /* 返回时如果构造成功,则直接退出 */
                if (sign == true) return 0;
                /* 如果构造不成功,还原当前位 */
                num[n/9][n%9] = 0;
            }
        }

检查每行、每列、每个九宫格是否有重复的数字

bool Check(int n, int key)
{
    /* 判断n所在横列是否合法 */
    for (int i = 0; i < 9; i++)
    {
        /* j为n竖坐标 */
        int j = n / 9;
        if (num[j][i] == key) return false;
    }
 
    /* 判断n所在竖列是否合法 */
    for (int i = 0; i < 9; i++)
    {
        /* j为n横坐标 */
        int j = n % 9;
        if (num[i][j] == key) return false;
    }
 
    /* x为n所在的小九宫格左顶点竖坐标 */
    int x = n / 9 / 3 * 3;
 
    /* y为n所在的小九宫格左顶点横坐标 */
    int y = n % 9 / 3 * 3;
 
    /* 判断n所在的小九宫格是否合法 */
    for (int i = x; i < x + 3; i++)
    {
        for (int j = y; j < y + 3; j++)
        {
            if (num[i][j] == key) return false;
        }
    }
 
    /* 全部合法,返回正确 */
    return true;
}
 

运行

困惑:跑出来两个一模一样,改了很久还是没弄好,烦

对于执行力,泛泛而谈的理解

执行力是指有效利用资源、保质保量达成目标的能力,指的是贯彻战略意图,完成预定目标的操作能力。是把企业战略、规划、目标转化成为效益、成果的关键。
--引用自《百度百科
泛泛而谈 指肤浅的讲出看法。浮于表面,没有深入研究。
--引用自《百度百科

简单而言,有了想法,而不去做是泛泛而谈,有了想法,就立刻付诸实践就是执行力。

PSP

PSP2.1 **Personal Software Process Stages ** 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 60 120
· Estimate · 估计这个任务需要多少时间 1440 4320
Development 开发
· Analysis · 需求分析 (包括学习新技术) 360 1440
· Design Spec · 生成设计文档 60 60
· Design Review · 设计复审 (和同事审核设计文档) 0 0
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 60 60
· Design ** · 具体设计** 120 1440
· Coding ** · 具体编码** 120 1440
· Code Review · 代码复审 0 0
· Test · 测试(自我测试,修改代码,提交修改) 0 0
Reporting 报告 60 60
· Test Report ** · 测试报告** 0 0
· Size Measurement · 计算工作量 60 60
· Postmortem & Process Improvement Plan ** · 事后总结, 并提出过程改进计划** 60 60
合计 ** ** 2400 9060

学习进度条

第N周 新增代码(行) 累计代码(行) 本周学习耗时(小时) 累计学习耗时(小时) 重要成长
0 137 137 72 72 学会博客写作规范,体会了自己找资料,写代码的过程