解题思路——生成数独终局
先来说说数独,数独这个经典的益智游戏,它的棋盘是一个9×9的格图,每3×3又是一个9宫格。
数独的要求是每行、每列、每个9宫格中,1~9这9个数字必须出现且仅出现一次。
了解了数独的规则之后,再来看看项目需求,第一个需求是要生成1e6种不同的数独终局。
要生成1e6个不同数独终局,这让我没什么头绪,之后在一位同学的博客上我看了他给出的解决方法:
将每一个数独看成数独第一行从第二行开始,分别右移3、6、1、4、7、2、5、8列的结果。由于数独左上角第一个数字固定,这样我们就得到8!=40320种终局。
我们还可以发现,对于任何一个数独终局的1~3行,我们任意交换这三行的顺序,得到的仍然是一个合法的终局,4~6行和7~9行同理,列也同理。这样我们又可以在刚刚的基础上,按照这种方法扩展出很多种终局。由于左上角不能动,我们只交换4~6行中的任意两行或者7~9行中的任意两行,这样在刚刚每种终局就可以变成3!×3!=36种终局,一共1451520种终局,已经超过了1e6,可以满足要求了。
于是,我去CSDN上去寻找了一个求全排列的算法,在此基础上构造我自己的数独生成算法。
下面是我的交换部分代码实现:

浙公网安备 33010602011771号