这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1 |
这个作业的要求在哪里 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494 |
这个作业的目标 | 完成数独 |
作业正文 | 如下 |
参考文献 | 百度 |
1.GitHub地址:https://github.com/stars123456?tab=repositories
2.PSP表格
PSP2.1 | Personal Software Process Stage | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 20 | 30 |
Estimate | 估计这个任务需要多少时间 | 30h | 56h |
Developmrnt | 开发 | 4h | 5h |
Analysis | 需求分析(包括学习新技术) |
1.5h |
2h |
Design Spec | 生成设计文档 | 30 | 50 |
Design Review | 设计复审 | 40 | 40 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 40 | 1h |
Design | 具体设计 | 3h | 4h |
Coding | 具体编码 | 3h | 4h |
Code Review | 代码复审 | 1h | 1.5h |
Test | 测试(自我测试,修改代码,提交修改) | 1h | 1.5h |
Reporting | 报告 | 30 | 40 |
Test Repor | 测试报告 | 30 | 30 |
Size Measurement | 计算工作量 | 30 | 30 |
Postmortem&Process Improvement Plan | 事后总结,并提出过程改进计划 | 40 | 50 |
合计 | 51.7h | 79.5h |
3.解题思路
刚开始看这个题目的时候整个人都是懵的,根本不知道从哪里开始下手,都准备放弃了。后面只能像赶鸭子上架一样不断寻求大佬的帮助和在百度上查找资料,然后慢慢的对题目有了点头绪,知道数独要用回溯法来解
4.代码设计
#include <stdio.h> int a[9][9]; int place(int x, int y) //二者分别是数组对应的行地址和列地址,取值为0-8 { int up, down, left, right; int i,j; up=x/3*3; down=up+3; left=y/3*3; right=left+3; //以下分三种情况判断是否在x,y对应的位置放这个数,如果不可以放,返回0,如果可以放,返回1,会进一步迭代 for(i=0;i<9;i++){ if(a[x][y]==a[i][y] && i!=x && a[i][y]!=0) return 0; } for(i=0;i<9;i++){ if (a[x][y]==a[x][i] && i!=y && a[x][i]!=0) return 0; } for(i=up;i<down;i++) { for(j=left;j<right;j++) if(i!=x || j!=y) { if(a[i][j]==a[x][y] && a[i][j]!=0) return 0; } } return 1; } void backtrack(int t) { int i,j; int x,y; if(t==81) { printf(" ============================= "); for(i=0;i<9;i++) { for(j=0;j<9;j++) printf("%d",a[i][j]); putchar(' '); } } else { x=t/9; y=t%9; //将这个转换为相应的数组行坐标和列坐标 if(a[x][y]!=0) { backtrack(t+1); } else { for(i=1;i<10;i++) { a[x][y]=i; if(place(x,y)==1) backtrack(t+1); a[x][y]=0; } } } } int main() { char str[9][9]; int i,j; for(i=0;i<9;i++) gets(str[i]); for(i=0;i<9;i++) for(j=0;j<9;j++) a[i][j]=str[i][j]-'0'; backtrack(0); return 0; }