#include <stdio.h>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int shudu[9][9], hole[9][9];
//打印数独
void ouput()
{
for (int i = 0; i < 9; ++i)
{
for (int j = 0; j < 9; ++j)
{
cout << shudu[i][j] << " ";
}
cout << endl;
}
}
// 初始化中间的九宫格
void shudu_1()
{
int a[10] = {};//初始化数组
int n = 0;
while(n < 9){
int m = rand() % 9 + 1;
int flag = 0;
for(int i = 0;i < n+1;i ++){
if(a[i] == m){
flag = 1;//如果之前保存的数中出现了和m相同的数,就把flag标记为1并跳出循环,表示需要重新生成随机数m
break;
}
}
if(flag == 0){
a[n] = m;//如果flag是0,表示前n个数中没有和m相同的数,因此可以把第n+1个元素赋值为m
n ++;
}
int k = 0;
for (int i = 3; i < 6; ++i)
for (int j = 3; j < 6; ++j)
shudu[i][j] = a[k++];
}
}
// 由中间的九宫格交叉变换,初始化上下左右四个九宫格 (交换行列)
void shudu_2()
{
for (int i = 3; i < 6; ++i)
{
int l = 0;
for (int j = 3; j < 6; ++j)
{
if (i == 3)
{
shudu[i + 1][l] = shudu[i][j];
shudu[i + 2][l + 6] = shudu[i][j];
l++;
}
else if (i == 4)
{
shudu[i + 1][l] = shudu[i][j];
shudu[i - 1][l + 6] = shudu[i][j];
l++;
}
else if (i == 5)
{
shudu[i - 2][l] = shudu[i][j];
shudu[i - 1][l + 6] = shudu[i][j];
l++;
}
}
}
for (int j = 3; j < 6; ++j)
{
int l = 0;
for (int i = 3; i < 6; ++i)
{
if (j == 3)
{
shudu[l][j + 1] = shudu[i][j];
shudu[l + 6][j + 2] = shudu[i][j];
l++;
}
else if (j == 4)
{
shudu[l][j + 1] = shudu[i][j];
shudu[l + 6][j - 1] = shudu[i][j];
l++;
}
else if (j == 5)
{
shudu[l][j - 2] = shudu[i][j];
shudu[l + 6][j - 1] = shudu[i][j];
l++;
}
}
}
}
// 初始化四个角上的四个九宫格(和上面原理相同)
void shudu_3()
{
for (int i = 0; i < 3; ++i)
{
int l = 0;
for (int j = 3; j < 6; ++j)
{
if (i == 0)
{
shudu[i + 1][l] = shudu[i][j];
shudu[i + 2][l + 6] = shudu[i][j];
l++;
}
else if (i == 1)
{
shudu[i + 1][l] = shudu[i][j];
shudu[i - 1][l + 6] = shudu[i][j];
l++;
}
else if (i == 2)
{
shudu[i - 2][l] = shudu[i][j];
shudu[i - 1][l + 6] = shudu[i][j];
l++;
}
}
}
for (int i = 6; i < 9; ++i)
{
int l = 0;
for (int j = 3; j < 6; ++j)
{
if (i == 6)
{
shudu[i + 1][l] = shudu[i][j];
shudu[i + 2][l + 6] = shudu[i][j];
l++;
}
else if (i == 7)
{
shudu[i + 1][l] = shudu[i][j];
shudu[i - 1][l + 6] = shudu[i][j];
l++;
}
else if (i == 8)
{
shudu[i - 2][l] = shudu[i][j];
shudu[i - 1][l + 6] = shudu[i][j];
l++;
}
}
}
}
// 根据选择的难度随机挖数
void dighole(int difficulty)
{
difficulty *= 20;
while (difficulty--)
{
shudu[rand() % 9][rand() % 9] = 0;
}
}
// 初始化数独
// 先随机生成中间的九宫格,再通过交叉生成上下左右四个九宫格,
// 最后通过交叉生成四个角上的九宫格
void Shudu(int difficulty)
{
memset(shudu, 0, sizeof(shudu));
shudu_1();
shudu_2();
shudu_3();
dighole(difficulty);
}
int main()
{
int d;
cout << "请选择您希望生成数独难度(输入1~4,数字越大难度越高): ";
cin >> d;
Shudu(d);
ouput();
return 0;
}