1、定义全局常量和初始化数独棋盘
#define SIZE 9
定义棋盘的大小为 9x9。int board[SIZE][SIZE]
初始化数独棋盘,用二维数组表示。0
表示空位,需要玩家填入数字,其他数字为预设的数字。
#include <stdio.h>
#include <stdbool.h>
#define SIZE 9
// 预设的数独谜题,0 表示空格
int board[SIZE][SIZE] = {
{5, 3, 0, 0, 7, 0, 0, 0, 0},
{6, 0, 0, 1, 9, 5, 0, 0, 0},
{0, 9, 8, 0, 0, 0, 0, 6, 0},
{8, 0, 0, 0, 6, 0, 0, 0, 3},
{4, 0, 0, 8, 0, 3, 0, 0, 1},
{7, 0, 0, 0, 2, 0, 0, 0, 6},
{0, 6, 0, 0, 0, 0, 2, 8, 0},
{0, 0, 0, 4, 1, 9, 0, 0, 5},
{0, 0, 0, 0, 8, 0, 0, 7, 9}
};
2、打印数独棋盘的函数 printBoard()
printBoard()
函数用于打印当前的数独棋盘,包括将每个 3x3 小网格用竖线和横线进行分割,帮助玩家直观地查看棋盘。如果棋盘某列处于第 3 列或第 6 列时,会在该列前加一个竖线分隔符。打印分割线 ---------------------
,形成 3x3 子网格的视觉效果。
#include <stdio.h>
#include <stdbool.h>
#define SIZE 9
// 预设的数独谜题,0 表示空格
int board[SIZE][SIZE] = {
{5, 3, 0, 0, 7, 0, 0, 0, 0},
{6, 0, 0, 1, 9, 5, 0, 0, 0},
{0, 9, 8, 0, 0, 0, 0, 6, 0},
{8, 0, 0, 0, 6, 0, 0, 0, 3},
{4, 0, 0, 8, 0, 3, 0, 0, 1},
{7, 0, 0, 0, 2, 0, 0, 0, 6},
{0, 6, 0, 0, 0, 0, 2, 8, 0},
{0, 0, 0, 4, 1, 9, 0, 0, 5},
{0, 0, 0, 0, 8, 0, 0, 7, 9}
};
// 打印数独棋盘
void printBoard() {
for (int row = 0; row < SIZE; row++) {
for (int col = 0; col < SIZE; col++) {
if (col == 3 || col == 6)
printf("| "); // 3x3 网格分割线
printf("%d ", board[row][col]);
}
if (row == 2 || row == 5) {
printf("\n---------------------"); // 3x3 网格分割线
}
printf("\n");
}
}
int main() {
printf("Hello, World!");
return 0;
}
3、验证输入数字是否合法的函数 isValid()
isValid(int row, int col, int num)
函数用于检查玩家输入的数字 num
是否可以放在 (row, col)
位置。
#include <stdio.h>
#include <stdbool.h>
#define SIZE 9
// 预设的数独谜题,0 表示空格
int board[SIZE][SIZE] = {
{5, 3, 0, 0, 7, 0, 0, 0, 0},
{6, 0, 0, 1, 9, 5, 0, 0, 0},
{0, 9, 8, 0, 0, 0, 0, 6, 0},
{8, 0, 0, 0, 6, 0, 0, 0, 3},
{4, 0, 0, 8, 0, 3, 0, 0, 1},
{7, 0, 0, 0, 2, 0, 0, 0, 6},
{0, 6, 0, 0, 0, 0, 2, 8, 0},
{0, 0, 0, 4, 1, 9, 0, 0, 5},
{0, 0, 0, 0, 8, 0, 0, 7, 9}
};
// 检查数字能否放置在特定位置
bool isValid(int row, int col, int num) {
// 检查行
for (int i = 0; i < SIZE; i++) {
if (board[row][i] == num)
return false;
}
// 检查列
for (int i = 0; i < SIZE; i++) {
if (board[i][col] == num)
return false;
}
// 检查 3x3 子网格
int startRow = row / 3 * 3;
int startCol = col / 3 * 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[startRow + i][startCol + j] == num)
return false;
}
}
return true;
}
int main() {
printf("Hello, World!");
return 0;
}
4、检查数独是否完成的函数 isComplete()
isComplete()
函数用于检查数独是否已经完成。遍历整个数独棋盘,检查是否还有空位(值为 0
),如果有空位返回 false
,表示游戏还未完成;如果没有空位则返回 true
,表示数独已经完成。
#include <stdio.h>
#include <stdbool.h>
#define SIZE 9
// 预设的数独谜题,0 表示空格
int board[SIZE][SIZE] = {
{5, 3, 0, 0, 7, 0, 0, 0, 0},
{6, 0, 0, 1, 9, 5, 0, 0, 0},
{0, 9, 8, 0, 0, 0, 0, 6, 0},
{8, 0, 0, 0, 6, 0, 0, 0, 3},
{4, 0, 0, 8, 0, 3, 0, 0, 1},
{7, 0, 0, 0, 2, 0, 0, 0, 6},
{0, 6, 0, 0, 0, 0, 2, 8, 0},
{0, 0, 0, 4, 1, 9, 0, 0, 5},
{0, 0, 0, 0, 8, 0, 0, 7, 9}
};
// 检查数独是否已经完成
bool isComplete() {
for (int row = 0; row < SIZE; row++) {
for (int col = 0; col < SIZE; col++) {
if (board[row][col] == 0)
return false;
}
}
return true;
}
int main() {
printf("Hello, World!");
return 0;
}
5、完整代码
一个简易的数独游戏,可以根据自己的需求进行扩展和完善。
#include <stdio.h>
#include <stdbool.h>
#define SIZE 9
// 预设的数独谜题,0 表示空格
int board[SIZE][SIZE] = {
{5, 3, 0, 0, 7, 0, 0, 0, 0},
{6, 0, 0, 1, 9, 5, 0, 0, 0},
{0, 9, 8, 0, 0, 0, 0, 6, 0},
{8, 0, 0, 0, 6, 0, 0, 0, 3},
{4, 0, 0, 8, 0, 3, 0, 0, 1},
{7, 0, 0, 0, 2, 0, 0, 0, 6},
{0, 6, 0, 0, 0, 0, 2, 8, 0},
{0, 0, 0, 4, 1, 9, 0, 0, 5},
{0, 0, 0, 0, 8, 0, 0, 7, 9}
};
// 打印数独棋盘
void printBoard() {
for (int row = 0; row < SIZE; row++) {
for (int col = 0; col < SIZE; col++) {
if (col == 3 || col == 6)
printf("| "); // 3x3 网格分割线
printf("%d ", board[row][col]);
}
if (row == 2 || row == 5) {
printf("\n---------------------"); // 3x3 网格分割线
}
printf("\n");
}
}
// 检查数字能否放置在特定位置
bool isValid(int row, int col, int num) {
// 检查行
for (int i = 0; i < SIZE; i++) {
if (board[row][i] == num)
return false;
}
// 检查列
for (int i = 0; i < SIZE; i++) {
if (board[i][col] == num)
return false;
}
// 检查 3x3 子网格
int startRow = row / 3 * 3;
int startCol = col / 3 * 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[startRow + i][startCol + j] == num)
return false;
}
}
return true;
}
// 检查数独是否已经完成
bool isComplete() {
for (int row = 0; row < SIZE; row++) {
for (int col = 0; col < SIZE; col++) {
if (board[row][col] == 0)
return false;
}
}
return true;
}
int main() {
int row, col, num;
printf("欢迎来到数独游戏!\n\n");
while (!isComplete()) {
printBoard();
// 提示玩家输入
printf("输入行(1-9), 列(1-9), 和数字(1-9): ");
scanf("%d %d %d", &row, &col, &num);
// 将输入转换为 0 索引的坐标
row--;
col--;
// 检查输入是否有效
if (row >= 0 && row < SIZE && col >= 0 && col < SIZE && num >= 1 && num <= 9) {
if (board[row][col] == 0) { // 只允许填入空格
if (isValid(row, col, num)) {
board[row][col] = num; // 如果合法,放入数字
} else {
printf("无效输入,数字 %d 不能放在(%d, %d)\n", num, row + 1, col + 1);
}
} else {
printf("该位置已经有数字,请选择其他位置\n");
}
} else {
printf("无效输入,请输入正确的行、列和数字(1-9)\n");
}
}
printf("恭喜你!你完成了数独!\n");
printBoard();
return 0;
}