用c语言写一个数独游戏
时间: 2024-04-30 20:24:21 浏览: 147
C语言编写的数独游戏
4星 · 用户满意度95%
以下是一个简单的用C语言编写的数独游戏程序,它使用了递归算法来解决数独谜题。
```c
#include <stdio.h>
#define ROWS 9
#define COLS 9
// 初始化数独盘面,0表示未填数字
int board[ROWS][COLS] = {
{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},
{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},
{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}
};
// 打印数独盘面
void print_board()
{
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
printf("%d ", board[i][j]);
}
printf("\n");
}
}
// 检查在row行col列填入数字val是否合法
int is_valid(int row, int col, int val)
{
// 检查行是否合法
for (int i = 0; i < COLS; i++) {
if (board[row][i] == val) {
return 0;
}
}
// 检查列是否合法
for (int i = 0; i < ROWS; i++) {
if (board[i][col] == val) {
return 0;
}
}
// 检查九宫格是否合法
int start_row = (row / 3) * 3;
int start_col = (col / 3) * 3;
for (int i = start_row; i < start_row + 3; i++) {
for (int j = start_col; j < start_col + 3; j++) {
if (board[i][j] == val) {
return 0;
}
}
}
return 1;
}
// 递归算法解决数独谜题
int solve(int row, int col)
{
// 找到最后一行最后一列,说明已经解决完了数独
if (row == ROWS - 1 && col == COLS) {
return 1;
}
// 到了一行末尾,换到下一行开头
if (col == COLS) {
row++;
col = 0;
}
// 如果当前位置已经有数字,跳过
if (board[row][col] > 0) {
return solve(row, col + 1);
}
// 尝试填入数字
for (int i = 1; i <= 9; i++) {
if (is_valid(row, col, i)) {
board[row][col] = i;
if (solve(row, col + 1)) {
return 1;
}
// 撤销当前填入的数字
board[row][col] = 0;
}
}
return 0;
}
int main()
{
printf("开始数独游戏!\n");
printf("请在输入时以行为单位,每行9个数字,空格用0表示:\n");
for (int i = 0; i < ROWS; i++) {
printf("请输入第%d行:", i + 1);
for (int j = 0; j < COLS; j++) {
scanf("%d", &board[i][j]);
}
}
printf("您输入的数独盘面为:\n");
print_board();
if (solve(0, 0)) {
printf("恭喜您,解决数独成功!\n");
printf("解决后的数独盘面为:\n");
print_board();
} else {
printf("很抱歉,无法解决数独!\n");
}
return 0;
}
```
在程序运行时,会提示用户输入数独盘面。用户需要以每行9个数字为一行输入,用0表示空格。程序会先打印出用户输入的数独盘面,然后尝试解决数独谜题,最后打印出解决后的数独盘面。如果无法解决数独,程序会提示用户。
阅读全文