2017软工第二次作业

1、Github项目地址

https://github.com/lijiaqun/work

2、在开始实现程序之前,用PSP表格记录下自己的估计将在程序的各个模块的开发上耗费的时间。

3、解题思路描述。即刚开始拿到题目后,如何思考,如何找资料的心路历程。

(1)安装VS
上学期安装过vs,所以安装vs时看了一下群里同学的安装教程博文http://www.cnblogs.com/Metak/p/7471671.html
就安装成功了,安装好后,又上网百度了一下vs的使用教程。
(2)对于题目的思考
刚开始拿到题目时,是一脸懵逼状态。自己代码打的又不好,当初数据结构学的也不行,完全不知道要用什么方法去实现,心里面还挺慌张的。也没什么思路,于是就开始百度,百度C++求解数独问题的算法,大概百度资料花了一天的时间,百度到的基本方法有回溯法,排列组合法,递归法等等。也在百度上看了一些代码,感觉回溯法解题比较容易理解,其他方法有的看懂了,有的方法也不是很懂。百度上的代码大多数都是只能求解数独所有解中的其中一个解,不符合题目的要求,题目要求是给出一个数N,输出N个符合的的解。鉴于回溯法比较容易理解,于是就想按照这个思路来写代码,由于题目的要求,第一个数是固定的,只需填充后面的80 个数。于是我的思路如下:
一个格子一个格子的填(从1到9一个一个数试),每填一个数检查该数在该行,该列,该宫是否符合条件,若符合条件,则继续填下一个数,否则回溯重置数独数组。

4、设计实现过程。(设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图)

  • 代码包括4个函数,一个是输出函数print(),一个是判断填入一个数时,每行每列每宫的条件是否满足的布尔函数check(),一个是填充数的函数sudoku(),填充过程中会判断是否满足条件以及输出等,还有一个是主函数main()。代码的组织情况是先写主函数main(),然后再分别写print()函数、check()函数和sudoku()函数。然后在主函数中调用suduko()函数,sudoku()中又会调print()函数、check()函数和sudoku()函数自身。

  • 代码还包括一个结构体Pos,Pos中含有两个数,一个是row,记录一个位置所在行,一个是col,几率一个位置所在的列。

  • 代码还包括一个队列Q,把数独中所有值为0的位置添加到Q中。

流程图如下:

5、代码说明:

print部分代码:

 void print()  
{
	int x,y;
    for(x=0;x<9;++x)
    {
        for(y=0;y<9;++y)
        {
           cout << shudu[x][y] <<' ';
        }
        cout << endl;
    }
    cout<<endl;
    cout<<endl; 
}  

check部分代码:

bool check(Pos p, int n)  
{  
    int curRow = p.row;  
    int curCol = p.col;  
    // 验证行列是否合格  
    for (int i = 0; i < 9; i++) {  
        if (shudu[i][curCol]==n || shudu[curRow][i]==n) {  
            return false;  
        }  
    }   
    // 验证九宫格内是否合格  
    int tempRow = curRow / 3 * 3;  
    int tempCol = curCol / 3 * 3;  
    for(int j = tempRow; j < tempRow + 3;++j){  
        for(int k = tempCol; k < tempCol + 3; ++k){  
            if(shudu[j][k]==n){  
                return false;  
            }  
        }  
    }  
  
    return true;  
}    

sudoku部分代码:

void sudoku(qpos & Q)  
{  
    if (Q.empty()) {  
    	
    	if(count<n)
    	{
        print();
        count++;
        return;
	}
    }  
    Pos cur(Q.front().row, Q.front().col);  
    Q.pop_front();  
    for (int i = 1; i <= 9; i++) {       // 从1到9轮流尝试  
        if ( check(cur, i) ) {  
            shudu[cur.row][cur.col] = i;   // 放置数字i到当前位置  
            sudoku(Q);  
            shudu[cur.row][cur.col] = 0;   // 将当前位置值重置  
        }  
    }         
    Q.push_front(cur);  // 重新插入该位置信息 
}  

6、测试运行:

7、记录在改进程序性能上所花费的时间,描述你改进的思路,并展示一张性能分析图,并展示你程序中消耗最大的函数。

改进的话,是听同学说用C语言输出到文件会更快,然后改为了用C语言输出到文件,感觉时间挺赶的,其他的也没改,回来会再看看,程序中消耗最大的函数应该是sudoku()函数。vs不太会调试,性能分析图做的也不知对不对,是输入1000时的性能分析图。

8、在你实现完程序之后,在下述PSP表格记录下你在程序的各个模块上实际花费的时间。

9、总结

感觉这次的作业完成的很艰难,完成的也不好,花费的时间也不少,代码能力以及各方面的能力有所欠缺,希望自己能慢慢进步。

posted @ 2017-09-10 22:20  lijiaqun  阅读(182)  评论(2编辑  收藏  举报