软件工程2019第三次作业

mac2022-06-30  23

Gthub地址

https://github.com/putaoputao303/031702516

Psp表格

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)Planning计划3040Estimate估计这个任务需要多少时间3040Development开发100100Analysis需求分析 (包括学习新技术)6066Design Spec生成设计文档3020Design Review设计复审55Coding Standard代码规范 (为目前的开发制定合适的规范)55Design具体设计2030Coding具体编码120100Code Review代码复审1010Test测试(自我测试,修改代码,提交修改)100120Reporting报告2020Test Repor测试报告3030Size Measurement计算工作量4045Postmortem & Process Improvement Plan事后总结, 并提出过程改进计划6070合计665681

需求

实现一个命令行程序,不妨称之为Sudoku。

百度百科简介:

数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。

设计思路

采用了回溯法。思路如下: 设了一个9X9的二维数组a[9][9],然后判断 值k是否可以插入某个点 a[i][j] ①该数组所有横向没有存在过k值 for(n=0;n<9;n++) if(a[i][n]==k)return 0; ②该数组纵向没有存在过k值 for(m=0;m<9;m++) if(a[m][j]==k)return 0; ③该点位于的九宫格3X3区间没有存在过k值 xm=(i/3)3,xn=(j/3)3; for(m=xm;m<xm+3;m++) for(n=xn;n<xn+3;n++) if(a[m][n]==k)return 0; 然后开始搜索的过程:9X9总共81个格子,就用一个数字n作为标记i,j坐标点的变量(i=n/9; j=n%9;),即:80就相当于最后一个格子 8/9=8,8%9=8 如果n等于80,那么就表示已经遍历到最后一个点了,如果满足条件的话就找到最终解了。 如果n不等于80,表示还要继续往下试,即用不同的k值试探当前i,j点是否可以放下,回归后回溯就ok了。

void SD(int a[9][9],int n)//求解

{

int i,j;

int b[9][9];

for(i=0;i<9;i++)

for(j=0;j<9;j++)

b[i][j]=a[i][j]; //用b进行尝试

i=n/9; j=n%9; //行列

if(a[i][j]!=0) //如果该位置固定

(n==80)?print(b):SD(b,n+1);

else

{

int k; //试数

for(k=1;k<=9;k++)

if(test(b,i,j,k)) //可以

{

b[i][j]=k; n==80?print(b):SD(b,n+1); b[i][j]=0; //回溯

}

}

} 完整代码如下:

#include<stdio.h>

int count=0;

void print(int a[9][9])

{

count++;

printf("case: %d:\n",count);

for(int i=0;i<9;i++)

for(int j=0;j<9;j++)

{

printf("%d",a[i][j]);

j==2?printf(" "):0;

j==5?printf(" "):0;

j==8?printf("\n"):0;

j==8&&i%3==2?printf("\n"):0;

}

}

//判断是否可以将第i行、第j列的数设为k

int test(int a[9][9],int i,int j,int k)

{

int m,n,xm,xn;

for(n=0;n<9;n++)

if(a[i][n]==k)return 0;

for(m=0;m<9;m++)

if(a[m][j]==k)return 0;

xm=(i/3)3,xn=(j/3)3;

for(m=xm;m<xm+3;m++)

for(n=xn;n<xn+3;n++)

if(a[m][n]==k)return 0;

return 1;

}

void SD(int a[9][9],int n)//求解

{

int i,j;

int b[9][9];

for(i=0;i<9;i++)

for(j=0;j<9;j++)

b[i][j]=a[i][j]; //用b进行尝试

i=n/9; j=n%9; //行列

if(a[i][j]!=0) //如果该位置固定

(n==80)?print(b):SD(b,n+1);

else

{

int k; //试数

for(k=1;k<=9;k++)

if(test(b,i,j,k)) //可以

{

b[i][j]=k; n==80?print(b):SD(b,n+1); b[i][j]=0; //回溯

}

}

}

int main()

{

int a[9][9];

printf("请输入原始数据,没有数据用0代替。\n");

for(int i=0;i<9;i++)

for(int j=0;j<9;j++)

scanf("%d",&a[i][j]);

printf("-------------------\n\n");

SD(a,0);

if(count==0)

printf("此数独无解!");

return 0;

} 在VS2017下编译运行时总是报错,至今我也不知道因为什么,等问问明白的人再做修改。

实验总结

GitHub的部分文件导入没查清楚,尝试了很多次真是太难用了,这几天我就看一下github里面的阅读指南,希望可以学会那里的操作,软件工程这门课真是不断让我学习新的东西,每次都是,对我来说作业开始困难起来,可能过几次会熟悉。

转载于:https://www.cnblogs.com/putaoputao/p/11580332.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)