【2019.09.19】数独(Sudoku)游戏之我见(软工实践第三次作业)

Github项目地址:https://github.com/MokouTyan/suduku_131700101

尚未完成内容:

代码经过Code Quality Analysis工具的分析并消除所有的警告。

使用性能分析工具Studio Profiling Tools来找出代码中的性能瓶颈并进行改进。

PSP表格

Personal Software Process Stages 预估耗时 实际耗时
Planning 计划 1小时 5分钟
Estimate 这个任务需要多少时间 26小时
Development 开发 5小时 4小时
Analysis 需求分析 (包括学习新技术) 2小时 1小时
Design Spec 生成设计文档 2小时 1小时
Design Review 设计复审 2小时 1小时
Coding Standard 代码规范 30分钟 1小时
Design 具体设计 30分钟 30分钟
Coding 具体编码 5小时 2小时
Code Review 代码复审 2小时 4小时
Test 测试(自我测试,修改代码,提交修改) 1小时 3小时
Reporting 报告 1小时
Test Repor 测试报告 1小时
Size Measurement 计算工作量 1小时
Postmortem 事后总结, 并提出过程改进计划 1小时
Improvement Plan 过程改进计划 1小时
合计 26小时

视频介绍所用思路

最近因为有自己的视频在做,所以有点忙不过来,这次的视频也是花了两小时赶出来的,以后如果太忙了可能不会做视频啦见谅(咕咕咕)

【2019.09.19】数独(Sudoku)游戏之我见(软工实践第三次作业)_第1张图片

如果看不清表盘填的数字可以在视频右下角切换清晰度

不论是inside函数还是outside函数,他们的执行顺序都是横纵宫

(其实这三个顺序无所谓的,但是三个都要去执行)

【2019.09.19】数独(Sudoku)游戏之我见(软工实践第三次作业)_第2张图片

黄色是传入函数的位置,而绿色是所要检测的格子

源代码解释

全局变量介绍:

//记录棋盘上的标记点
//前两个[10][10]是棋盘上的具体位置
//第三个[10]是记录当前位置数字的可能性
bool sign[10][10][10];
//记录标记点的可能性剩余个数 
int sign_count[10][10]; 
//记录棋盘上的具体数字
int checkerboard[10][10];
//记录类型,区分三...九宫格
int type; 

初始化表盘:

在CMD中输入type和棋盘个数后进入循环

在开始处理数据前先进行表盘重置化

每个位置的可能性初期都为9个(根据输入type大小而定)

表盘上所有数字为0(代表空)

sign第三个[]内的0号位都为False,其意义是还未填入数字

每个位置上的第一格到第九格可能性都存在(标为True)

void reset()
{
    for ( int i=1 ; i

inside函数解释:

我用的第一个函数,我称为inside函数

从头到尾遍历,向函数传递格子的位置

它会检测当前位置横、纵、九宫格有没有数字的格子

如果有数字存在并且该数字可能性还未去掉

便把该格子上的相同数字的可能性去掉,同时可能性数量-1

如果当可能性等于1时,立即写入数字

//查出所有空缺的可能性(位置上还没有数字) 
//此时是扣除所在位置的可能性 
int inside(int x, int y)
{
    //排除横向可能性
    int remove;
    for( int i=1 ; i

write函数:

写入数字的时候会把位置上的标记改为存在数字(该位置sign第三个的[0]=True)

可能性数量变为0(该位置的sign_count=0;)

防止被二次修改

//填入确定值 
int write(int x,int y)
{
    //这个位置标记为存在数字 
    sign[x][y][0]=true;
    sign_count[x][y]=0;
    //填入数字 
    for ( int i=1 ; i

在写入数字的函数结束前

此时调用第二个函数,我称为outside函数

outside函数:

传入所写数字的位置

将它的横纵九宫格上所有格子上的相同数字的可能性去掉

当其他位置可能性数量为1的时候

再次立即调动write函数

//去除所填位置的横纵九宫格所有同数可能性(位置上刚填入数字) 
//此时是扣除所填位置的横纵九宫格的其他位置可能性 
int outside(int x,int y) 
{
    //remove是当前位置填入的数字 
    int remove=checkerboard[x][y];
    for( int i=1 ; i

总结:

这个解决方案只能解决唯一解的数独问题

面对多个解的数独棋盘,这个方法可能解不完整,会有空缺位置

【2019.09.19】数独(Sudoku)游戏之我见(软工实践第三次作业)_第3张图片

你可能感兴趣的:(【2019.09.19】数独(Sudoku)游戏之我见(软工实践第三次作业))