用c语言写数独游戏的代码
时间: 2024-05-09 18:15:28 浏览: 8
以下是用 C 语言实现的数独游戏代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define SIZE 9
// 数独格子的结构体
typedef struct {
int row;
int col;
int value;
} Cell;
// 数独游戏的结构体
typedef struct {
int board[SIZE][SIZE];
} Sudoku;
// 函数声明
void init_sudoku(Sudoku *sudoku);
void print_sudoku(Sudoku *sudoku);
int is_valid(Sudoku *sudoku, Cell cell);
int solve(Sudoku *sudoku, int index);
int get_next_empty_cell(Sudoku *sudoku, Cell *cell);
int main() {
Sudoku sudoku;
init_sudoku(&sudoku);
printf("Original Sudoku:\n");
print_sudoku(&sudoku);
if (solve(&sudoku, 0)) {
printf("Solved Sudoku:\n");
print_sudoku(&sudoku);
} else {
printf("Failed to solve the Sudoku.\n");
}
return 0;
}
// 初始化数独游戏
void init_sudoku(Sudoku *sudoku) {
int board[SIZE][SIZE] = {
{0, 0, 0, 0, 0, 4, 0, 0, 0},
{7, 0, 0, 0, 0, 0, 2, 0, 3},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 5, 0, 7, 0, 0},
{0, 0, 0, 7, 0, 0, 0, 0, 0},
{0, 6, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0, 0, 0},
};
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
sudoku->board[i][j] = board[i][j];
}
}
}
// 打印数独游戏
void print_sudoku(Sudoku *sudoku) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
printf("%d ", sudoku->board[i][j]);
}
printf("\n");
}
}
// 判断一个格子是否合法
int is_valid(Sudoku *sudoku, Cell cell) {
// 判断行是否合法
for (int i = 0; i < SIZE; i++) {
if (sudoku->board[cell.row][i] == cell.value) {
return 0;
}
}
// 判断列是否合法
for (int i = 0; i < SIZE; i++) {
if (sudoku->board[i][cell.col] == cell.value) {
return 0;
}
}
// 判断九宫格是否合法
int start_row = (cell.row / 3) * 3;
int start_col = (cell.col / 3) * 3;
for (int i = start_row; i < start_row + 3; i++) {
for (int j = start_col; j < start_col + 3; j++) {
if (sudoku->board[i][j] == cell.value) {
return 0;
}
}
}
// 如果行、列、九宫格都合法,则返回 1,表示格子合法
return 1;
}
// 递归求解数独游戏
int solve(Sudoku *sudoku, int index) {
// 如果数独已经解完,则返回 1
if (index >= SIZE * SIZE) {
return 1;
}
// 找到下一个空格子
Cell cell;
if (get_next_empty_cell(sudoku, &cell)) {
// 从 1 到 9 枚举该格子的可能取值
for (int i = 1; i <= 9; i++) {
cell.value = i;
// 如果该格子的取值合法,则继续递归求解
if (is_valid(sudoku, cell)) {
sudoku->board[cell.row][cell.col] = cell.value;
if (solve(sudoku, index + 1)) {
return 1;
}
sudoku->board[cell.row][cell.col] = 0;
}
}
// 如果枚举完所有可能的取值都无法求解,则返回 0
return 0;
} else {
// 如果没有空格子了,则返回 1
return 1;
}
}
// 获取下一个空格子
int get_next_empty_cell(Sudoku *sudoku, Cell *cell) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (sudoku->board[i][j] == 0) {
cell->row = i;
cell->col = j;
cell->value = 0;
return 1;
}
}
}
return 0;
}
```
代码中使用了递归函数求解数独游戏,具体实现方法是从左到右、从上到下依次枚举每个格子的可能取值,如果该格子的取值合法,则继续递归求解下一个格子,直到求解完所有格子或者发现无法求解。如果求解完所有格子,则返回 1,表示数独已经解完;如果发现无法求解,则返回 0,表示数独无解。