用c语言代码写数独游戏
时间: 2023-08-15 12:08:15 浏览: 131
好的,以下是C语言代码实现数独游戏的生成和打印:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
// 初始化数独游戏
void init_sudoku(int sudoku[ROW][COL]) {
int i, j;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
sudoku[i][j] = 0;
}
}
}
// 打印数独游戏
void print_sudoku(int sudoku[ROW][COL]) {
int i, j;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
printf("%d ", sudoku[i][j]);
}
printf("\n");
}
}
// 检查行是否合法
int check_row(int sudoku[ROW][COL], int row, int val) {
int j;
for (j = 0; j < COL; j++) {
if (sudoku[row][j] == val) {
return 0;
}
}
return 1;
}
// 检查列是否合法
int check_col(int sudoku[ROW][COL], int col, int val) {
int i;
for (i = 0; i < ROW; i++) {
if (sudoku[i][col] == val) {
return 0;
}
}
return 1;
}
// 检查3x3的宫格是否合法
int check_box(int sudoku[ROW][COL], int row, int col, int val) {
int i, j, row_start, col_start;
row_start = (row / 3) * 3;
col_start = (col / 3) * 3;
for (i = row_start; i < row_start + 3; i++) {
for (j = col_start; j < col_start + 3; j++) {
if (sudoku[i][j] == val) {
return 0;
}
}
}
return 1;
}
// 检查当前数字是否可行
int check_valid(int sudoku[ROW][COL], int row, int col, int val) {
return check_row(sudoku, row, val) &&
check_col(sudoku, col, val) &&
check_box(sudoku, row, col, val);
}
// 递归填充数独游戏
int fill_sudoku(int sudoku[ROW][COL], int row, int col) {
// 边界条件:填充完最后一行
if (row == 8 && col == 9) {
return 1;
}
// 边界条件:填充完一行
if (col == 9) {
row++;
col = 0;
}
// 如果当前位置已经填充了数字,则跳过
if (sudoku[row][col] > 0) {
return fill_sudoku(sudoku, row, col + 1);
}
// 枚举当前位置可以填充的数字
int val;
for (val = 1; val <= 9; val++) {
// 检查当前数字是否可行
if (check_valid(sudoku, row, col, val)) {
sudoku[row][col] = val;
// 递归填充下一个位置
if (fill_sudoku(sudoku, row, col + 1)) {
return 1;
}
// 回溯
sudoku[row][col] = 0;
}
}
return 0;
}
// 生成数独游戏
void create_sudoku(int sudoku[ROW][COL]) {
// 初始化随机数种子
srand(time(NULL));
// 生成第一行的随机排列
int i, j, k, first_row[9];
for (i = 0; i < 9; i++) {
first_row[i] = i + 1;
}
for (i = 0; i < 9; i++) {
j = rand() % 9;
k = first_row[i];
first_row[i] = first_row[j];
first_row[j] = k;
}
// 填充第一行
for (j = 0; j < 9; j++) {
sudoku[0][j] = first_row[j];
}
// 递归填充数独游戏
fill_sudoku(sudoku, 0, 0);
}
int main() {
int sudoku[ROW][COL];
init_sudoku(sudoku);
create_sudoku(sudoku);
print_sudoku(sudoku);
return 0;
}
```
运行以上代码,即可生成一个随机的数独游戏。
阅读全文