数独

软件基础个人工程——数独4

落爺英雄遲暮 提交于 2020-01-20 00:07:35
GITHUB项目地址: https://github.com/hhz-hhz/Sudoku_software_engineer.git 软工基础个人项目——数独1 软工基础个人项目——数独2 软件基础个人工程——数独3 四、测试阶段 1、同测试设计文档一样对程序进行了测试: 但SolvingSudoku.cpp中: 由于inline bool CheckingForDFS(int n, int key)和inline int SolvingByDFS(int n)都是用了全局数组,所以没有办法对它们单独进行测试。 GeneratingSudoku.cpp中: inline void MovingStep()也是同上述一样的情况,所以也没有办法测试。 由此可以看出全局变量对于软件开发的弊端。 2、单元测试:测试代码见UnitTest文件夹 3、测试代码覆盖率测试: 4、进行完单元测试后的性能测试: 1)-c 1000000:对生成终局进行测试 2)-s D:\sudoku\Debug\sudokutest.txt:求解1000个终局 五、总结和优化阶段 1、后续的优化 关于求解终局,求解1000个数独需要耗时与生成1000000个终局的时间几乎相同,但是当求解1000000个终局的时候还是需要花费很长一段时间,所以从性能分析表上看,需要对求解数独的方式进行优化

数独_单元测试

十年热恋 提交于 2020-01-19 20:56:04
目录 单元测试 数独生成模块的测试 求解数独模块的测试 mainfun函数的测试 计算文件行数函数的测试 单元测试 单元测试主要分为5部分, 数独生成模块的测试 数独题目生成模块的测试 求解数独模块的测试 mainfun函数的测试 计算文件行数函数的测试 数独生成模块的测试 由于数独生成模块终局路径不由用户给出,所以不用测试路径的合法性,只需测试生成不同数量的终局,由于需求要求生成数独个数在1~1000000之间,而且通过mainfun函数的合法性判断,数独生成模块generate_final的参数取值只可能为1~1000000。为所以我们给出的测试用例分别为。 为了检验是否生成所给要求的数独,实现了一个函数,可以通过计算终局文件的行数来确定生成终局的个数。 测试内容 测试用例 生成终局数目 0 1 500 1000000 TEST(GenerateTest, size1) { generate_final(1, FINALPATH); int sign = value_file(1, FINALPATH); EXPECT_TRUE(sign); } TEST(GenerateTest, size500) { generate_final(500, FINALPATH); int sign = value_file(500, FINALPATH); EXPECT_TRUE(sign

【软件工程基础】个人项目之数独求解代码优化

一世执手 提交于 2020-01-19 13:18:42
1.0版本性能分析   这一部分出现了一些小问题,主要是忘记进行性能检测了。因为在生成数独题目的时候,就索性进行了数独读入方面的优化,然后那部分的优化代码写完之后就直接把求解数独部分的读入一块更新了。所以只能直接把优化好的代码和性能分析结果贴出来了。 代码优化   前面也介绍过,这一部分的代码优化主要是读入数独和输出求解后的数独部分的代码优化。   首先是题目读入部分,方法从原来的一个个数的读入改成一行一行的数据读入,然后将读入的数据放入一个二位的int型数组进行后续的求解操作。然后是输出部分,因为求解好的数独存放在一个二维数组中,所以我的做法是效仿生成数独终局中的输出方法,将整个数独的结果放进一个一维数组中,这部分代码也和生成数独终局部分的一样。具体代码如下: while (ProblemOfSudoku.getline(str, LINE_LENGTH)) //读数独终局 { int ll = strlen(str); //读入的每一行的长度 for (int i = 0; i < ll; i++) { if (i % 2 == 0) { solve_sudoku[linecount][i / 2] = str[i] - '0'; } } linecount++; if (linecount % 9 == 0) //读完一整个数独后进行相应的操作 { linecount = 0

软件工程个人项目—数独

£可爱£侵袭症+ 提交于 2020-01-19 00:17:28
Sudoku项目流程(心路历程) 项目地址 github仓库 主要内容 PSP 2.1 表格 项目的准备过程 项目实现过程 项目的分析改进过程 PSP 2.1表格 PSP 2.1 Personal Software Process Stages 预计耗时(分钟) 实际耗时(分钟) Planning 计划 50 60 Estimate 估计这个任务需要多久 300 360 Development 开发 240 270 Analysis 需求分析 25 25 Design Spec 生成设计文档 60 60 Design Review 设计复审 10 10 Coding Standard 代码规范 5 5 Design 具体设计 20 20 Coding 具体编码 240 240 Code Review 代码复审 5 5 Test 测试 30 30 Reporting 报告 60 60 Test Report 测试报告 Size Measurement 计算工作量 Postmortem & Process Improvement Plan 事后总结,提出过程改进意见 项目准备过程 碎碎念 在刚知道个人作业是写一个数独小项目时,我的内心是崩溃的。因为我从来就没有玩过数独,看见老师发的pdf里生成终局的示例那一长串的数字,我的内心感到十分抗拒。。。 所以这个作业一直拖着没有做直到今天。。。

软件工程——数独 集成测试2

江枫思渺然 提交于 2020-01-18 09:00:14
一、 换行格式问题 在与同学进行测试的过程中发现,一个文件的换行格式可以有多种,即CRLF,CR,LF三种,而我在进行输入输出的时候使用ReadFile和WriteFile进行文件输入输出仅考虑了字符数为1的情况。在大多数情况下,Windows文件格式为CRLF,因此需要对文件进行判断。其中输出可以不用修改,但是读入需要进行修改判断该文件是采用CRLF还是其他的。 对原代码进行修改,在读取文件前先进行判断,即先读入若干字符,判断换行是否为\r\n若是则修改一个数独的字符大小为19*9+2(原为18*9+1),同时修改crlf变量为2(原为1),这样就对原代码进行了修改,经过测试通过。 代码修改如下: namespace SudokuReader { int num_bytes_of_sudoku_infile = 18 * 9 + 1; int crlf = 1;//默认只是一个字符 inline void toSudoku( char * tmp, DWORD & n_bytes_read, const bool & is_end) { //由于读取时的限制,一定有num_of_sudoku_in_buff <= BUFF_SIZE int num_of_sudoku_in_buff = n_bytes_read / num_bytes_of_sudoku_infile; 10.

软件工程——数独 测试1

会有一股神秘感。 提交于 2020-01-16 16:14:19
命令解析模块测试 测试代码 #include "pch.h" #include "share.h" int **sudoku = nullptr; int num_of_sudoku = 0;//第几个数独表 int upper_limit_of_sudoku = 0; HANDLE h_sudoku_txt = INVALID_HANDLE_VALUE; HANDLE h_sudoku_problem_txt = INVALID_HANDLE_VALUE; void closeTxt() { if (h_sudoku_txt != INVALID_HANDLE_VALUE) CloseHandle(h_sudoku_txt); if (h_sudoku_problem_txt != INVALID_HANDLE_VALUE) CloseHandle(h_sudoku_problem_txt); h_sudoku_problem_txt = INVALID_HANDLE_VALUE; h_sudoku_txt = INVALID_HANDLE_VALUE; } void mallocSudoku() { if (sudoku == nullptr) { sudoku = new int* [10]; for (int i = 0; i < 10; i++) { sudoku[i]

python 解决数独

狂风中的少年 提交于 2020-01-16 00:44:49
数独问题解释 一、数独问题的基本规则 规则一:同一行数字不同 规则二:同一列数字不同 规则三:同一宫数字不同 二、解决数独的策略 1,简单方法 第一步,在每个格子中按照 基本规则MT4 写入可能的结果 第二步,判断每个格子中结果的个数,如果结果唯一,则写入该数字。 第三步,返回步骤一,循环 停止的标志:填满所有格子,或格子中可能的结果最小数大于1。 2,中级方法 第一步,使用简单方法 第二步,在每一宫中,某个数字出现的次数只有一次,直接填入该数字 第三步,返回步骤一,循环 停止的标志:不在有数字填入 3,终极方法 第一步,使用中级方法 第二步,对每个位置的每个可能的答案进行假设,并推导矛盾,排除。 (1)在第一个位置上,填入第一个可能的答案 (2)使用中级方法,推导填入数字 (3)如果矛盾A出现,假设不成立,返回该位置,填入第二个答案。 如果矛盾B出现,假设暂时成立,进入下一位置,填入答案。 循环结束标志:填满数字并符合基本规则 三 代码如下 import pandas as pd import numpy as np shudu_data=pd.read_csv('data/shudu.csv') data=shudu_data.copy() def block(i,data): ru3_1=data.iloc[0:3,0:3] ru3_2=data.iloc[0:3,3:6]

数独 ( 三 ) ——解数独

﹥>﹥吖頭↗ 提交于 2020-01-15 05:09:49
数独 ( 三 ) ——解数独 我的地址:https://github.com/gmj0301/gmj 请翻看前面的博客,有细节上的修改。 解题思路 使用深度优先搜索方法,该过程简单。但是当求解题目数量达到很大时,所用时间很长。剪枝是很重要的一个环节。 剪枝过程 对于数独终局的每一个位置,都代表递归过程中的一层,每次在当前位置填入一个数字后,通过遍历当前行、当前列、以及当前 3 × 3 网格中的数字,就可以排除不符合条件的数字,从而达到剪枝的目的。 剪枝的过程其实已经完成了对当前数独的合法性的检查。 函数设计 judge函数 当把数字填入蓝色的空时,填入的数字,要考虑是否与黄色部分重复,重复不能填入。 机器不能像人一样,可以在填入之前就可直接判断出是否重复,需要选定一个数字填入后再判断。 判断过程有三步: 该数字所处行是否有重复,如果有,返回 false; 该数字所处列是否有重复,如果有,返回 false; 该数字所处九宫格是否有重复,如果有,返回 false; 在判断第 3 步时,需找到九宫格的数组下标范围。 在设计时,我的存储数独的数组下标本身比他的个数少 1,需先除以 3 确定是第几个行或列,再乘以 3 确定该九宫格的第一行,加 2 确定最后行。 如,检查下标为 [ 0, 2 ] 位置的数字,0 ÷ 3 = 0,0 × 3 = 0,0 + 2 = 2,第一个九宫格的行数由 0

【第一篇】数独终局

隐身守侯 提交于 2020-01-12 12:02:20
个人项目:生成数独终局并求解 一.项目介绍及地址 二.PSP时间估计 三.解题思路 1.生成数独 2.求解数独 四.设计实现 1.需求分析 (1)功能分析 (2)功能建模 一.项目介绍及地址 GitHub:Sylph3/SoftwareEngineering 实现一个能够生成数独终局并且能求解数独问题的控制台程序。 二.PSP时间估计 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 90 Estimate 估计任务需要多少时间 20 Development 开发 2500 Analysis 需求分析(新技术) 400 Design Spec 生成设计文档 60 Design Review 设计复审 30 Coding Standard 代码规范 10 Design 具体设计 300 Coding 具体编码 1200 Coding Review 代码复审 200 Test 测试 300 Reporting 报告 410 Test Report 测试报告 330 Size Measurement 计算工作量 20 Postmortem&Process Improvement Plan 事后总结,提出改进 60 总计 3000 三.解题思路 1.生成数独 通过参考资料 1 ,我了解到:每个数独终局

【第三篇】数独终局

亡梦爱人 提交于 2020-01-11 12:46:22
个人项目:生成数独终局并求解 四.设计实现 2.编码实现 (2)求解数独模块设计实现 注:这周时间不太充裕,内容相对较简略,详细内容之后更新。 四.设计实现 2.编码实现 (2)求解数独模块设计实现 求解数独我首先尝试了DLX算法,但写到一半发现时间成本可能过高,因此转变成了基本的回溯算法,如果之后时间有充裕再考虑进一步优化成DLX算法。 回溯算法主要由SolveSoduku函数实现。 首先以ifstream的getline方法读入每行(ifstream正常读入的话遇空格、换行停止),对读入的每行数据进行处理,存入数组矩阵grid中。同时记录行数,当行数达到9,说明已经读入了一个完整的矩阵,进行回溯求解。 对每个完整矩阵的回溯求解以SolveSingleSoduku函数处理。标识矩阵中某一点是否被访问,一开始我用了非常繁复的方法,后来通过查阅资料 1 发现,可以通过设置一个vis数组进行实现: 使用vis[3][10][10]数组来标记:其中第一维中0表示行、1表示列、2表示九宫格;第二维中表示在第几个行、列或九宫格中;第三维表示其中的某个数字,如果该数字被填入了,vis值置1,否则置0。 因此,对于一个数独的具体求解就可以转化为:顺序搜索整个盘面数组grid,找到未填入数的格点(即数值=0),for循环1-9尝试放入数,继续向后填数,若最终整个棋盘都被填满,置is