GitHub地址:
项目地址:https://github.com/zhoujingping/project1
搭建环境:win10 64位
使用工具:VC6.0
使用语言:c++
解题思路:
我的解题思路大致分为三步:
第一步:初始化二维数组num[0][i]和一维数组b[i],使得这两个数组存入1-9互不相同的随机数,num数组是用来存放结果,b数组当中的随机值在符合条件的情况下用来依次插入到num数组。
如何产生1-9互不相同的随机数?我的思路大致是这样的:先把1-9依次存入a数组当中,然后产生随机数下标,使得b[i]=a[index],index是随机数,为了避免产生一样的随机数,每赋值一次,使a[index]标记为0。
第二步:利用回溯法依次对要插入的位置进行对值的判断和选择,回溯法所在函数分为四个分支
判断行大于第九行时,则结束
判断符合check函数条件,则填入相关数字
判断b中的元素是否已经用完
判断当没有合适的数字可以填入时,则递归下一个准备填入的数字
第三步:check函数
判断行数字是否相等
判断列数字是否相等
判断小九宫格数字是否相等。
流程图:
代码说明:
#include<iostream> #include<ctime> #include<fstream> using namespace std; int num[9][9]; int b[9],a[9]; bool check(int i,int j,int k) { int m,n; //判断行是否相同 for(n=0;n<9;n++) { if(num[i][n] == k) return false; } //判断列是否相同 for(m=0;m<9;m++) { if(num[m][j]==k) return false; } //判断块是否相同 int t1=(i/3)*3,t2=(j/3)*3; for(m=t1;m<t1+3;m++) { for(n=t2;n<t2+3;n++) { if(num[m][n] == k) return false; } } return true; } bool sudoku(int i, int j, int *a) { //如果大于第九行,则结束 if (i > 8) { return true; } //符合check函数条件,则填入 if (check(i, j, *a)){ num[i][j] = *a; if (sudoku(i + (j + 1) / 9, (j + 1) % 9, b)) {//从i行的元素一个一个依次递归,填入相应符合条件的数字 return true; } } num[i][j] = 0; //判断b中的元素是否已经用完 if (a - b >= 8) { return false; } //若没有合适的数字可以填入,则递归下一个准备填入的数字是否符合 if (sudoku(i, j, a + 1)) { return true; } } int main(){ int i,j,index,n,z; ofstream location_out; location_out.open("sudoku.txt", std::ios::out | std::ios::app); srand(unsigned(time(0))); cin>>n; for(z=0;z<n;z++){ for(i=0;i<9;i++){ a[i]=i+1; } //生成一个数组存放1-9 for(i=0;i<9;){ index=rand()%9; if(a[index]!=0){ num[0][i]=a[index]; //生成随机数下标,并赋值给num,b,使得num,b存入1-9互不相同的随机数 b[i]=a[index]; a[index]=0; ++i; } } sudoku(1,0,b); for(i=0;i<9;i++) { for(j=0;j<9;j++){ cout<<num[i][j]<<" "; location_out<<num[i][j]<<" "; } cout<<endl; location_out<<endl; } cout<<endl; location_out<<endl; for(i=0;i<9;i++){ for(j=0;j<9;j++){ num[i][j]=0; } } } return 0; }
运行结果:
PSP表格:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 100 | 120 |
· Estimate | · 估计这个任务需要多少时间 | 350 | 600 |
Development | 开发 | 200 | 450 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 60 |
· Design Spec | · 生成设计文档 | 20 | 20 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 35 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 15 | 15 |
· Design | · 具体设计 | 120 | 150 |
· Coding | · 具体编码 | 150 | 200 |
· Code Review | · 代码复审 | 30 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 20 | 20 |
Reporting | 报告 | 20 | 25 |
· Test Report | · 测试报告 | 10 | 14 |
· Size Measurement | · 计算工作量 | 20 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 30 |
性能测试:
我的感想:
这道题我是写不出来的,只能不断的百度,不断的去看百度上的代码,不断的去看别人的思路,不断的尝试,我花了很长时间,也很焦虑,但我觉得自己有在进步,我的算法还非常差,但我相信会越来越好。