GitHub项目地址:
我的github项目链接:https://github.com/ShowFs/20177585/tree/master
需求
实现一个命令行程序,不妨称之为Sudoku。
百度百科简介:
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
具体任务:
现在我们想一步一步来,完成从三宫格到九宫格的进阶;完成三宫格和其他博客任务,就算过了初级考核,其他的算升级。具体各阶规则如下:
三宫格:盘面是33。使1-3每个数字在每一行、每一列中都只出现一次,不考虑宫;
四宫格:盘面是22四个宫,每一宫又分为22四个小格。使1-4每个数字在每一行、每一列和每一宫中都只出现一次;
五宫格:盘面是55。使1-5每个数字在每一行、每一列中都只出现一次,不考虑宫;
六宫格:盘面是23六个宫,每一宫又分为32六个小格。使1-6每个数字在每一行、每一列和每一宫中都只出现一次;
七宫格:盘面是77。使1-7每个数字在每一行、每一列中都只出现一次,不考虑宫;
八宫格:盘面是42八个宫,每一宫又分为24八个小格。使1-8每个数字在每一行、每一列和每一宫中都只出现一次;
九宫格:盘面是33九个宫,每一宫又分为3*3九个小格。使1-9每个数字在每一行、每一列和每一宫中都只出现一次;
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 120 | 120 |
Estimate | 估计这个任务需要多少时间 | 3600 | 7200 |
Development | 开发 | 60 | 60 |
Analysis | 需求分析 (包括学习新技术) | 60 | 120 |
Design Spec | 生成设计文档 | 30 | 30 |
Design Review | 设计复审 | 60 | 30 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 60 |
Design | 具体设计 | 120 | 120 |
Coding | 具体编码 | 120 | 180 |
Code Review | 代码复审 | 120 | 120 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 180 |
Reporting | 报告 | 120 | 150 |
Test Repor | 测试报告 | 30 | 60 |
Size Measurement | 计算工作量 | 30 | 30 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 120 |
合计 | 3600 | 9600 |
解题思路
对于算法我并不敏感,没有办法自己根据题目条件了解到底需要什么算法,只能百度寻找类似的题目去看,一下是找到的部分解题思路:
dfs题,从第一个空格开始填数,只填能填的数(这是一个需要判断的过程,需要边走边判断),如果当前空格填不了数字了,就退回到前一个空格能填的下一个数(回溯),直到最后一个空填上数字,就结束了。
还有很多其他的算法·,我也看不懂就算了
下面是部分代码:
dfs部分
public void dfs(int m,int n){
for(int i = 1;i<=9;i++){
panduan[i] = false;
}
if(m10){
System.out.println("有解");
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
System.out.print(map[i][j]);
}
System.out.println();
}
}
else{
judge(m, n);
for(int i = 1;i<=9;i++){//核心步骤
if(panduan[i]false){
if(map[m][n]!=0){
if(n9){
dfs(m+1, 1);
}else{
dfs(m, n+1);
}
}else{
map[m][n] = i;
if(n9){
dfs(m+1,1);
}else{
dfs(m,n+1);
}
}
}
}
map[m][n] = 0;
return;
}
判断部分
public void judge(int x,int y){//用于找出当前点能填的数
int fromX = (x-1)/33+1;
int toX = (x-1)/33+3;
int fromY = (y-1)/33+1;
int toY = (y-1)/33+3;
for(int i = fromX;i<=toX;i++){
for(int j = fromY;j<=toY;j++){
panduan[map[i][j]] = true;
}
}
for(int i=1;i<=9;i++){
panduan[map[i][y]] = true;
panduan[map[x][i]] = true;
}
}
性能测试
说句实话,性能测试工具在装,也出现了很多问题,没办法电脑配置太低。。。。暂时也还不会使用,后面能装上的话再来编辑算了。
总结
这次作业花了很长的时间,但是对我来说收效甚微,我这低配的电脑装不上VS,百度了很多办法也无法解决问题,本来也不怎么会用java,无奈之下只能选择IDEA,由于以前完全没有使用过IDEA,所以算是从头开始,研究软件的使用就花了很长的时间,我并不适合这个专业,对于理科完全学不懂,因此也完全没有兴趣进行这个专业的学习,当初这个专业是随便选的,也不了解这个专业,只能尽力的完成作业,在网上查了很多乱七八糟的资料,算法也学不懂,本来就是一个理科渣,还好死不死的进了这全是数学的专业,只能勉强理解一些简单的原理。对于这次作业,在规定的时间里我并没有能完整完成,只能后期再尽量去补好了。
作业自评
这次作业虽然不想但的确水平很低很敷衍。