高级软件工程-第二次作业-数独
https://github.com/mengyitf/sudoku
1. github地址
2. 解题思路
数独的要求是在9*9宫格中每一行,每一列,每一个3*3的小九宫格都是由1到9不重复的数字组成的。
其中可以看到:
(1)行交换或者列交换的时候,行和列的值不会改变。例如,我将第1列和第3列交换。
可以发现列交换的时候,列的值完全没有改变,行的值顺序变了,但是值依旧是1到9中没有重复的数。只要保证在列交换和行交换的时候,对应的3*3小九宫格不会格式错误就行。
怎么样做才能做到这点呢?观察可以发现,在小九宫格中行和行交换,列和列交换,小九宫格是不会异常的。直接进行大九宫格所在的行或者列进行交换也是能够得到不变的格式。
(2)在一个数独矩阵中,全部相同数值交换也是不会破坏数独的格式的。例如,我将所有的4和2交换。
可以发现2和4的位置虽然变了,但是整体的结构是没有变化的。
3. 设计实现
(1)构建一个可行的数独
(2)产生1到9不重复的任意随机数与数独棋盘中从1到9的数一一替换。例如第一次产生随机数6,则所有的6与1交换。
(3)每个数都交换之后,进行小九宫格行或列交换。
4. 代码说明
1 void value_exchange(int i,int c){ 2 int j, p; 3 for (j = 0; j < 9; ++j){ 4 for (p = 0; p < 9; ++p){ 5 if(sudoku[j][p]==i){ 6 sudoku[j][p] = c; 7 }else if(sudoku[j][p]==c){ 8 sudoku[j][p] = i; 9 } 10 } 11 } 12 }
value_exchange()是进行值交换,其中i表示循环中1到9中的一个值,c表示1到9中的不重复的随机值。
1 void row_exchange(int i,int u){ 2 int j,p,t,c,r1,r2; 3 r1 = (i-1)/3*3; 4 r2 = (i-1)%3*3; 5 for (j = 1; j < 3; ++j){ 6 c = (j+u)%3; 7 for (p = 0; p < 9; ++p){ 8 t = sudoku[r1+j][p]; 9 sudoku[r1+j][p] = sudoku[r1+c][p]; 10 sudoku[r1+c][p] = t; 11 } 12 u = ++u % 3; 13 if(u=0)u=1; 14 c = (j+u)%3; 15 for (p = 0; p < 9; ++p){ 16 t = sudoku[p][r2+j]; 17 sudoku[p][r2+j] = sudoku[p][r2+c]; 18 sudoku[p][r2+c] = t; 19 } 20 } 21 }
row_exchange()是小九宫格内行列交换的操作,其中i表示循环中的值,行或列交换的偏移量。
k = 511; for (i = 1; i < 10; ){ u = rand() % 2 + 1; //位置交换 c = rand() % 9 + 1; //交换因子 if((k>>(c-1))%2>0){ value_exchange(i, c); row_exchange(i, u); k = k - (1<<(c-1)); ++i; } }
在这个代码中由c产生随机值,k等于511,511表示二进制中九个1,使用移位运算来判断是否重复产生值。没有重复将k中对应位的1设置为0,否则继续产生随机数。例如产生随机数5,则111111111设置为111101111。
5. 运行测试
控制台运行mian -c 3
6. 性能分析
当生成数独棋盘1000个时
当生成数独棋盘为4000时
当生成数独棋盘数为10000时
7. PSP
PSP | Personal Software Process Stages | 实际耗时(分钟) |
Planning | 计划 | 30 |
Estimate | 估计这个任务需要多少时间 | 30 |
Development | 开发 | 300 |
Analysis | 需求分析 (包括学习新技术) | 100 |
Design Spec | 生成设计文档 | 30 |
Design Review | 设计复审 (和同事审核设计文档) | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 |
Design | 具体设计 | 30 |
Coding | 具体编码 | 120 |
Code Review | 代码复审 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 20 |
Reporting | 报告 | 30 |
Test Report | 测试报告 | 20 |
Size Measurement | 计算工作量 | 30 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 |
合计 | 850 |