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小时 |
视频介绍所用思路
最近因为有自己的视频在做,所以有点忙不过来,这次的视频也是花了两小时赶出来的,以后如果太忙了可能不会做视频啦见谅(咕咕咕)
如果看不清表盘填的数字可以在视频右下角切换清晰度
不论是inside函数还是outside函数,他们的执行顺序都是横纵宫
(其实这三个顺序无所谓的,但是三个都要去执行)
黄色是传入函数的位置,而绿色是所要检测的格子
源代码解释
全局变量介绍:
//记录棋盘上的标记点
//前两个[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
总结:
这个解决方案只能解决唯一解的数独问题
面对多个解的数独棋盘,这个方法可能解不完整,会有空缺位置