数独设计
软件工程第二次作业
1、github地址
2、解题思路:
在以前,没怎么接触过数独。刚看到这个题目的时候,有些懵。后面去百度,了解了它的规则,接着又去做了几个数独题目。参考了一些网上资料,最初的想法是在一个小九宫格里面进行行变化或者列变化,这样就不会影响其他的小九宫格。后面觉得这样实现有些复杂。干脆第一行先排列,再去判断下一个数能否填入。要求是行、列、小九宫格里面不会有重复的数字出现。后面和同学讨论了后,由于原来判断填入的下一个数是从小到大进行判断,所以后面将其改为随机生成一个数,进行填入,可能性会变多。
3、设计实现:
代码中运用了三个函数(初始化函数、判断函数、主函数),核心是判断函数。
4、代码显示:
头文件:
include "stdafx.h"
include "cstdlib"
include "time.h"
include "algorithm"
include "iostream"
include "fstream"
判断函数:
bool judge(int i, int j)
{
if (i > 9 || j > 9)
return true;
for(int k=1;k<=9;k++)
{
bool can = true;
for(int m =1;m<i;++m)
if (sodu[m][j] == k)
{
can = false;
break;
}
if (can)
{
for(int n=1;n<j;++n)
if (sodu[i][n] == k )
{
can = false;
break;
}
}
if (can)
{
int x = (i / 3) * 3 + 3;
int y = (j / 3) * 3 + 3;
if (i % 3 == 0)
{
x = i;
}
if (j % 3 == 0)
{
y = j;
}
for (int p = x - 2; p <= x; ++p) // 检查在3×3的小方格中是否出现了同一个数字
{
if (can == false) //跳出外层循环
break;
for (int q = y- 2; q <= y; ++q)
if (sodu[p][q] == k)
{
can = false;
break;
}
}
}
if (can)
{
sodu[i][j] = k;
if (j<9)
{
if (judge(i, j + 1)) //到同一行的下一位置开始搜索
return true;
}
else
{
if (i < 9)
{
if (judge(i + 1, 1)) // 到下一行的第一个空格开始搜索
return true;
}
else
return true; //i >= 9 && j >= 9 , 搜索结束
}
sodu[i][j] = 0; //关键这一步:找不到解就要回复原状,否则会对下面的搜索造成影响
}
}
return false; //1到9都尝试过都不行,则返回递归的上一步
}
初始化函数:
void init(void)
{
for (i = 1; i < 10; i++)
{
for ( j = 1; j < 10; j++)
sodu[i][j] = 0;
} // 初始化
for (int i = 1; i <= 9; i++)
{
sodu[1][i] = i;
}
sodu[1][1] = num;
sodu[1][num] = 1; //按要求固定第一个数,然后该数为序号对应的数与其交换
random_shuffle(&(sodu[1][2]), &(sodu[1][10])); //第一个数固定,后八位随机排列
judge(2, 1); //从第二行第一个数开始判断
}
主函数(输出函数):
int main()
{
ofstream fout("soduku.txt"); //按要求输出.txt文件
cin >> N;
for (int w = 0; w < N; w++)
{
init();
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= 9; j++)
fout << sodu[i][j] << " ";
fout << endl;
}
fout << endl;
}
fout << flush;
fout.close();
return 0;
}
5:、函数关系:
6、实验结果:
7、性能分析:
性能分析后,发现自己的代码程序跑的很慢。然后将其输出函数改为以下(快了一点点):
freopen("soduku.txt", "w", stdout);
N = 100000;
for (int w = 0; w < N; w++)
{
init();
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= 9; j++)
printf("%d ",sodu[i][j]);
putchar('\n');
}
putchar('\n');
}
8、PSP表格(感觉自己做的时候没有按照这些步骤来):
9、实践总结:
这次实践,让我感受到了很大的压力。很多都是刚接触的新软件,新的IDE,一时没有很好的适应下来。熟悉软件的过程中经常出错,而且一出错不知道怎么返回上一步,只好从头再来。还有就是编码的过程,让我体会到和同学一起讨论的乐趣,慢慢的收获越来越多,虽然最后的代码不是很好,但对自己来说也算是一个小小的进步了。继续加油。