2017软工实践第二次作业(未完成)(已退选)

我的作业

老师紧紧抓住暑假的尾巴···给我们布置了一次作业···
生成数独?好像很久没见过数独这个东西了···一脸懵逼,百度!百度!
网上一般都是回朔法什么的,看的我头晕···直到我找到了这个(https://my.oschina.net/wangmengjun/blog/781984)
大概的思路是:交换一三行,四六行,七九行,整个数独仍然是符合要求的数独,交换列的话同理,此外还衍生出好几种变化
盗几张图来示意一下

此外,交换两个数字的位置也是可以的,比如,把所有的1换成2,把所有的2换成1 。当时第一想法就是有点像魔方,变来变去的就可以了(好像不太恰当···)
总之,感觉这个方法好理解很多,就决定用这个方法了。
要求最好用Visual Studio 2015/2017,官网安装,好像还行,功能感觉很厉害,但我还是比较喜欢简单的DEV C++ ···
根据我的思路,我写了8个函数,分别是3个行变化,3个列变化,2个块变化(一个九宫格为一小块,连续3个小块为一块),我想着既然都写8个了,不如再写一个凑足9个,刚好匹配9个数字,一个数字对应一种变化,然后写了第九个,作用是随机产生两个数字,交换这两个数字的所有位置

srand(unsigned(time(nullptr)) + rand());
	x = rand() % 9+1;
	y = (x + s[1][3]) % 9+1;        // s[1][3]随手一打····

之后我就想这9个函数要以怎样的顺序执行,我最开始是使用已知的数独的第一行数字作为顺序控制函数执行,执行了几次个位数的变化,感觉还行 ···次数多了 ,开始出现重复的···
我发现最最中间的数很难变化到,只有随机变换位置的连个数字涉及时才会改变,可能是这个原因?然后我写了第十个变化····交换s[0][4]和s[4][4]的两个数字的位置,在最开始就执行。
然而,问题依然没有解决···后来我看所有输出的第一行都是以2开头(要求是这样,我学号19 (1+9)% 9 + 1 = 2),然后1到9每个数字出现一次,我想可能是这里出问题了。
我开始使用对角线的数字控制函数执行,结果好像成功了?也可能还有重复吧···反正我看了几十个好像没发现一样的···多了我也看不过来啊···
(仍然存在许多问题···9.10又修改了几个地方)

void shengcheng(int s[9][9])   //生成一个新的数独
{
	int i = 0;
	int m[9];
	change9(s);               //随机交换两个数字,增大随机性
	changex(s);				 //随机交换两个数字,增大随机性
	for (i = 0; i < 9; i++)   //记录对角线数字
	{
		m[i] = s[i][i];
	}
	for (i = 0;i < 9; i++)   //根据对角线数字进行变化
	{
		if (m[i] == 1)
		{
			change1(s);
			continue;
		}
		if (m[i] == 2)
		{
			change2(s);
			continue;
		}
		if (m[i] == 3)
		{
			change3(s);
			continue;
		}
		if (m[i] == 4)
		{
			change4(s);
			continue;
		}
		if (m[i] == 5)
		{
			change5(s);
			continue;
		}
		if (m[i] == 6)
		{
			change6(s);
			continue;
		}
		if (m[i] == 7)
		{
			change7(s);
			continue;
		}
		if (m[i] == 8)
		{
			change8(s);
			continue;
		}
		if (m[i] == 9)
		{
			change9(s);
			continue;
		}
		else continue;
	}
	first_num(s);
};

其他还有挺多东西没弄好,github和vs都不太会用,这个算法感觉也不完美,简单是简单,存在重复的可能,先这样吧。准备补考~

posted @ 2017-09-10 08:14  ===  阅读(191)  评论(1编辑  收藏  举报