使用C语言实现一个数独生成器,可以随机生成数独题,并调试输出。
时间: 2024-03-10 12:44:31 浏览: 252
九宫格数独题目生成器.rar
下面是使用C语言实现一个数独生成器的示例代码,包括随机生成数独题和调试输出:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 9
#define BLOCK_SIZE 3
int sudoku_board[N][N] = {0}; // 数独棋盘
int answer_board[N][N] = {0}; // 数独答案
int blank_count = 0; // 空白数量
// 检查数字n是否可以填在行row,列col处
int check(int n, int row, int col) {
// 检查行和列
for (int i = 0; i < N; i++) {
if (sudoku_board[row][i] == n || sudoku_board[i][col] == n) {
return 0;
}
}
// 计算所在的3x3小方格的左上角坐标
int block_row = row / BLOCK_SIZE * BLOCK_SIZE;
int block_col = col / BLOCK_SIZE * BLOCK_SIZE;
// 检查小方格
for (int i = block_row; i < block_row + BLOCK_SIZE; i++) {
for (int j = block_col; j < block_col + BLOCK_SIZE; j++) {
if (sudoku_board[i][j] == n) {
return 0;
}
}
}
return 1;
}
// 递归生成数独题
void generate(int row, int col) {
if (row == N) { // 棋盘填满了
return;
}
int next_row = col == N - 1 ? row + 1 : row;
int next_col = (col + 1) % N;
if (sudoku_board[row][col] != 0) { // 已经填过数字了,继续填下一个
generate(next_row, next_col);
} else {
// 随机填写数字
for (int i = 1; i <= N; i++) {
if (check(i, row, col)) {
sudoku_board[row][col] = i;
generate(next_row, next_col);
sudoku_board[row][col] = 0;
}
}
}
}
// 随机移除数独题中的数字
void remove_numbers(int count) {
int *removed = (int *)malloc(count * sizeof(int));
for (int i = 0; i < count; i++) {
int row = rand() % N;
int col = rand() % N;
while (sudoku_board[row][col] == 0) { // 已经移除过了,重新选择一个
row = rand() % N;
col = rand() % N;
}
removed[i] = sudoku_board[row][col];
sudoku_board[row][col] = 0;
}
free(removed);
}
// 输出数独棋盘
void print_board(int board[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%d ", board[i][j]);
}
printf("\n");
}
}
int main() {
srand(time(NULL)); // 初始化随机数生成器
generate(0, 0); // 生成数独题
blank_count = N * N / 2; // 设置空白数量为总格子数的一半
remove_numbers(blank_count); // 移除数字
// 备份答案
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
answer_board[i][j] = sudoku_board[i][j];
}
}
// 输出数独题和答案
printf("Sudoku puzzle:\n");
print_board(sudoku_board);
printf("\nSudoku answer:\n");
print_board(answer_board);
return 0;
}
```
这个数独生成器使用了递归算法来生成数独题,并在生成完成后随机移除一些数字来形成空白的数独题。在移除数字之前,先备份了答案,以便后面进行调试输出。
阅读全文