数独设计

软件工程第二次作业

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,一时没有很好的适应下来。熟悉软件的过程中经常出错,而且一出错不知道怎么返回上一步,只好从头再来。还有就是编码的过程,让我体会到和同学一起讨论的乐趣,慢慢的收获越来越多,虽然最后的代码不是很好,但对自己来说也算是一个小小的进步了。继续加油。
posted @ 2017-09-10 20:42  six丶世界的尽头  阅读(549)  评论(4编辑  收藏  举报