|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <time.h>
|
|
|
|
|
|
|
|
|
|
#define SIZE 9
|
|
|
|
|
#define FILLED_NUMS 3
|
|
|
|
|
|
|
|
|
|
void initializeBoard(int board[SIZE][SIZE]) {
|
|
|
|
|
// 填充前3行,包含1-9所有数字
|
|
|
|
|
int used[SIZE] = { 0 }; // 记录已使用的数字
|
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
|
|
// 清空used数组
|
|
|
|
|
for (int j = 0; j < SIZE; j++) {
|
|
|
|
|
used[j] = 0;
|
|
|
|
|
}
|
|
|
|
|
int count = 0;
|
|
|
|
|
while (count < FILLED_NUMS) {
|
|
|
|
|
int num = rand() % SIZE + 1; // 生成1到9之间的随机数
|
|
|
|
|
if (!used[num - 1]) { // 如果该数字未使用
|
|
|
|
|
board[i][rand() % SIZE] = num; // 在随机位置填入数字
|
|
|
|
|
used[num - 1] = 1; // 标记该数字为已使用
|
|
|
|
|
count++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 填充第4-6行与第7-9行
|
|
|
|
|
for (int i = 3; i < SIZE; i++) {
|
|
|
|
|
// 每行填充三个随机数,确保每行的数字互不相同
|
|
|
|
|
for (int j = 0; j < SIZE; j++) {
|
|
|
|
|
board[i][j] = 0; // 初始化为0
|
|
|
|
|
}
|
|
|
|
|
int used[SIZE] = { 0 }; // 记录这一行已使用的数字
|
|
|
|
|
int count = 0;
|
|
|
|
|
while (count < FILLED_NUMS) {
|
|
|
|
|
int num = rand() % SIZE + 1; // 生成1到9之间的随机数
|
|
|
|
|
if (!used[num - 1]) { // 如果该数字未使用
|
|
|
|
|
board[i][rand() % SIZE] = num; // 在随机位置填入数字
|
|
|
|
|
used[num - 1] = 1; // 标记该数字为已使用
|
|
|
|
|
count++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void printSudoku(int board[SIZE][SIZE]) {
|
|
|
|
|
for (int i = 0; i < SIZE; i++) {
|
|
|
|
|
for (int j = 0; j < SIZE; j++) {
|
|
|
|
|
if (j % 3 == 0 && j != 0) {
|
|
|
|
|
printf("| ");
|
|
|
|
|
}
|
|
|
|
|
if (board[i][j] == 0) {
|
|
|
|
|
printf(". "); // 用'.'表示空白
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
printf("%d ", board[i][j]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
printf("\n");
|
|
|
|
|
if ((i + 1) % 3 == 0 && i != 8) {
|
|
|
|
|
printf("---------------------\n");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
srand(time(NULL)); // 重置随机数种子
|
|
|
|
|
int board[SIZE][SIZE] = { 0 }; // 初始化9×9数组
|
|
|
|
|
initializeBoard(board); // 随机生成不完整数独矩阵
|
|
|
|
|
printSudoku(board); // 格式化输出
|
|
|
|
|
return 0;
|
|
|
|
|
}
|