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都不太会用,这个算法感觉也不完美,简单是简单,存在重复的可能,先这样吧。准备补考~