2020软件工程作业03

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.1Personal 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;

}

posted @ 2020-03-29 19:31  谭明水  阅读(157)  评论(1编辑  收藏  举报