写一个C语言程序生成数独游戏
时间: 2023-12-29 14:09:10 浏览: 115
好的,以下是一个简单的 C 语言程序,用于生成数独游戏:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 9
#define BLOCK_SIZE 3
// 检查某个数字是否可以放置在某个位置
int is_valid(int board[][SIZE], int row, int col, int num) {
// 检查行是否合法
for (int i = 0; i < SIZE; i++) {
if (board[row][i] == num) {
return 0;
}
}
// 检查列是否合法
for (int i = 0; i < SIZE; i++) {
if (board[i][col] == num) {
return 0;
}
}
// 检查 3x3 方块是否合法
int block_row = row / BLOCK_SIZE;
int block_col = col / BLOCK_SIZE;
for (int i = block_row * BLOCK_SIZE; i < block_row * BLOCK_SIZE + BLOCK_SIZE; i++) {
for (int j = block_col * BLOCK_SIZE; j < block_col * BLOCK_SIZE + BLOCK_SIZE; j++) {
if (board[i][j] == num) {
return 0;
}
}
}
return 1;
}
// 生成数独游戏
void generate(int board[][SIZE], int row, int col) {
// 如果已经生成了 9 行,说明数独已经生成完毕,打印出来
if (row == SIZE) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
printf("%d ", board[i][j]);
}
printf("\n");
}
printf("\n");
return;
}
// 如果已经到达某一行的末尾,就递归到下一行的第一列
if (col == SIZE) {
generate(board, row + 1, 0);
return;
}
// 如果当前位置已经有数字了,就递归到下一个位置
if (board[row][col] != 0) {
generate(board, row, col + 1);
return;
}
// 生成 1~9 的随机数,检查是否可以放置在当前位置
for (int num = 1; num <= SIZE; num++) {
if (is_valid(board, row, col, num)) {
board[row][col] = num;
generate(board, row, col + 1);
board[row][col] = 0;
}
}
}
int main() {
srand(time(NULL));
int board[SIZE][SIZE] = {0};
generate(board, 0, 0);
return 0;
}
```
该程序使用回溯法生成数独游戏,具体过程如下:
1. 从第一行第一列开始,逐个格子地填入数字;
2. 对于每个格子,随机生成 1~9 的数字,检查是否可以放置在当前位置;
3. 如果可以放置,就填入数字,并递归到下一列的格子;
4. 如果下一列的格子已经超过了第九列,就递归到下一行的第一列;
5. 如果已经生成了第九行,就说明数独已经生成完毕,打印出来;
6. 如果无法放置当前数字,就回溯到上一个格子,重新尝试其他数字。
注意,该程序生成的数独游戏可能有多个解,因此在实际应用中还需要进行进一步的处理。
阅读全文