给出一个最简单的生成数独初盘的程序,不保证有唯一解,终盘的正确性通过填充的过程来确定,可以用舞蹈链算法求解该数独得到其中一个解
随机生成的方法就算交换行和列然后随机挖洞
这里有一点要注意的就是交换的行和列必须处于同一宫中,要不然交换之后保证不了正确性
然后就是随机挖洞,可以直接随机一个坐标,或者用洗牌算法(类似于扫雷初盘的生成)
vector<vector<int> > generate(const int & level) {
vector<vector<int> > mtx =
{ {9 ,8 ,7 ,6 ,5 ,4 ,3 ,2 ,1},
{4 ,5, 6 ,2 ,3 ,1 ,7 ,8 ,9},
{3 ,2 ,1 ,7 ,8 ,9 ,4 ,5 ,6},
{1 ,3 ,5 ,8 ,6 ,7 ,2 ,9 ,4},
{8 ,4 ,2 ,3 ,9 ,5 ,6 ,1 ,7},
{6 ,7 ,9 ,1 ,4 ,2 ,5 ,3 ,8},
{2 ,6 ,3 ,9 ,7 ,8 ,1 ,4 ,5},
{7 ,9 ,4 ,5 ,1 ,3 ,8 ,6 ,2},
{5 ,1 ,8 ,4 ,2 ,6 ,9 ,7 ,3} };
int remain = -1;
switch (level)
{
case 0:
remain = 30;
break;
case 1:
remain = 25;
break;
case 2:
remain = 21;
break;
case 3:
remain = 18;
break;
default:
break;
}
for (int i = 0; i < 25; &