2020软件工程作业03
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494 |
这个作业的目标 | 编写程序 |
作业正文 | |
其他参考文献 | 百度 |
1.GitHub项目地址
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(小时) | 实际耗时(小时) |
---|---|---|---|
Planning | 计划 | 90 | 66 |
Estimate | 估计这个任务需要多少时间 | 90 | 66 |
Development | 开发 | 4 | 14 |
Analysis | 需求分析 (包括学习新技术) | 4 | 4 |
Design Spec | 生成设计文档 | 3 | 3 |
Design Review | 设计复审 | 4 | 4 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 6 | 6 |
Design | 具体设计 | 30 | 30 |
Coding | 具体编码 | 3 | 3 |
Code Review | 代码复审 | 1 | 1 |
Test | 测试(自我测试,修改代码,提交修改 | 2 | 2 |
Reporting | 报告 | 4 | 4 |
Test Repor | 测试报告 | 5 | 5 |
Size Measurement | 计算工作量 | 1 | 1 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 2 | 1.5 |
合计 | 66 | 66 |
3.需求
实现一个命令行程序,不妨称之为Sudoku
4.解题思路:
到网上搜了很久,也请教了同学。但是自己基础不好,还是没搞懂。很多地方不会。哎。代码写在这里了。
#include<iostream>
using namespace std;
int a[9][9];
int t1,t2;
//赋初值
void add(int a[9][9])
{
for(int i=0;i<9;i++)
{cout<<"输入第"<<i+1<<"行数据";
for(int j=0;j<9;j++)
{
cin>>a[i][j];
}
}
}
void print(int a[9][9])
{
cout<<"========================"<<endl;
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
cout<<a[i][j]<<" ";
if((j+1)%3==0)
cout<<"||";
}
cout<<endl;
if((i+1) %3==0)
cout<<"========================"<<endl;
}
}
void check(int a[9][9])
{
int at=20;//让程序自己找几遍
while(at--)
{
int p1,p2,p3,p4,p5,p6,p7,p8,p9;
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
{
if(a[i][j]==0)
{ int k=0;
p1=p2=p3=p4=p5=p6=p7=p8=p9=1;
//遍历九宫格
int i1=(i/3)*3;
int j1=(j/3)*3;
for(int m=i1;m<i1+3;m++)
{
for(int n=j1;n<j1+3;n++)
{
if(a[m][n]==1&&p1--)
{k++;}
if(a[m][n]==2&&p2--)
{k++;}
if(a[m][n]==3&&p3--)
{k++;}
if(a[m][n]==4&&p4--)
{k++;}
if(a[m][n]==5&&p5--)
{k++;}
if(a[m][n]==6&&p6--)
{k++;}
if(a[m][n]==7&&p7--)
{k++;}
if(a[m][n]==8&&p8--)
{k++;}
if(a[m][n]==9&&p9--)
{k++;}
}
}
//九宫格遍历完,行遍历开始
for(int jj=0;jj<9;jj++)
{
if(a[i][jj]==1&&p1)
{k++;p1--;}
if(a[i][jj]==2&&p2)
{k++;p2--;}
if(a[i][jj]==3&&p3)
{k++;p3--;}
if(a[i][jj]==4&&p4)
{k++;p4--;}
if(a[i][jj]==5&&p5)
{k++;p5--;}
if(a[i][jj]==6&&p6)
{k++;p6--;}
if(a[i][jj]==7&&p7)
{k++;p7--;}
if(a[i][jj]==8&&p8)
{k++;p8--;}
if(a[i][jj]==9&&p9)
{k++;p9--;}
}
//行结束,列开始遍历
for(int ii=0;ii<9;ii++)
{
if(a[ii][j]==1&&p1--)
{k++;}
if(a[ii][j]==2&&p2--)
{k++;}
if(a[ii][j]==3&&p3--)
{k++;}
if(a[ii][j]==4&&p4--)
{k++;}
if(a[ii][j]==5&&p5--)
{k++;}
if(a[ii][j]==6&&p6--)
{k++;}
if(a[ii][j]==7&&p7--)
{k++;}
if(a[ii][j]==8&&p8--)
{k++;}
if(a[ii][j]==9&&p9--)
{k++;}
}
//列遍历完毕,k是否为8,是填数 否下一个
//k为8 说明该空唯一因为 9-1=8
if(k==8)
//找p几不是0,那么该空就是p几对应的数
{
if(p1==1)
a[i][j]=1;
else if(p2==1)
a[i][j]=2;
else if(p3==1)
a[i][j]=3;
else if(p4==1)
a[i][j]=4;
else if(p5==1)
a[i][j]=5;
else if(p6==1)
a[i][j]=6;
else if(p7==1)
a[i][j]=7;
else if(p8==1)
a[i][j]=8;
else if(p9==1)
a[i][j]=9;
}//填数完成
}//if结束
}//大循环结束
}//while结束
}//check 结束
//另一种数独简单方法,怎么说呢 在该数所在九宫格内 有一个数唯一的话就填
void check_two(int a[9][9])
{
int coun=0;
for(int r=0;r<3;r++)
{
for(int t=0;t<3;t++)
{
//填唯一的数
for(int v1=1;v1<=9;v1++)
{
int count1=0;
for(int v2=r*3;v2<r*3+3;v2++)
{
for(int v3=t*3;v3<t*3+3;v3++)
{ int count=0;
if(a[v2][v3]==0)
{
a[v2][v3]=v1;
for(int m1=r*3;m1<r*3+3;m1++)
for(int m2=t*3;m2<t*3+3;m2++)
if(a[m1][m2]==v1)
count++;
//列判断
for(int n1=0;n1<9;n1++)
if(a[n1][v3]==v1)
count++;
//行判断
for(int n2=0;n2<9;n2++)
if(a[v2][n2]==v1)
count++;
//判断count==3 行 列 九宫格 +1
if(count==3)
{
count1++;
t1=v2,t2=v3;
a[v2][v3]=0; // 反正t1 t2 已经记下了v2 v3 而且只有一次才会正确,如果两次为0 也就是说已经不可能了
}
else //count连3都不等于 那么一定不是v1这个数 。。。置零
a[v2][v3]=0;
}//if a[v2][v3]==0
}//3 for
}//2 for
if(count1==1&&a[t1][t2]==0)
{a[t1][t2]=v1;
}
}//1 for
coun=0;
}//2 for
}//1 for
}
//用来数 9x9 格子有几个不是0的
int fi(int a[9][9])
{
int e=0;
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
if(a[i][j]!=0)
e++;
return e;
}
void caishu(int a[9][9])//顾名思义 猜数 ,假设该格子为一个数 ,在调用上面方法
{
int a_cope[9][9];
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
a_cope[i][j]=a[i][j];
for(int m=0;m<9;m++)
for(int n=0;n<9;n++)
if(a_cope[m][n]==0)
for(int v=1;v<=9;v++)
{
a_cope[m][n]=v;
check(a_cope); //这两个可以多来几遍
check_two(a_cope); //这两个可以多来几遍 以保证数可以填完
check(a_cope);
check_two(a_cope);
check(a_cope);
check_two(a_cope);
check(a_cope);
check_two(a_cope);
if(fi(a_cope)==81)
{ for(int f=0;f<9;f++)
for(int g=0;g<9;g++)
a[f][g]=a_cope[f][g];
break;
}
else
{
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
a_cope[i][j]=a[i][j];
}
}
}
int main()
{
cout<<"依次输入数独内容:"<<endl;
add(a);
check(a);
check_two(a);
check(a);
check_two(a);
check(a);
print(a);
if(fi(a)==81)
{cout<<"所得结果如下:"<<endl;
print(a);
}
else
{ caishu(a);
print(a);
}
system("pause");
return 0;
}