让我们来详细讲解一下“C语言解数独程序的源码”的完整攻略。
什么是数独?
在介绍程序之前,我们先来了解一下数独。
数独是一种智力游戏,由9x9的方格组成,分成9个3x3的小方格,在已知数的基础上填上未知的数字,使得每一行、每一列和每一个小方格内的数字均为1~9,且不重复。数独不但能训练大脑的逻辑、思维能力,还能减轻压力、增加乐趣。
源码分析
下面,我们来分析一下用C语言编写的解数独的源码。
头文件
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> // 使用bool类型
这部分代码引入了需要用到的头文件,其中stdbool.h提供了bool类型的定义,用于简化代码中的布尔类型的使用。
数独矩阵的定义
#define N 9 // 数独规格
int sudoku[N][N]; // 数独矩阵
这部分代码定义了数独的规格为9x9(即N=9),并声明了一个包含81个元素的数独矩阵。
初始化数独
void init_sudoku(void)
{
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
scanf("%d", &sudoku[i][j]); // 标准输入读取数独矩阵
}
}
}
这部分代码实现了初始化数独功能,在标准输入中读取数独矩阵,并将其保存在代码中定义的数独矩阵中。
判断是否可以填入数字
_Bool can_fill(int row, int col, int num)
{
// 行、列、小方格均无重复数字
for (int i = 0; i < N; i++) {
if (sudoku[row][i] == num || sudoku[i][col] == num) {
return false;
}
}
int row_start = row / 3 * 3;
int col_start = col / 3 * 3;
for (int i = row_start; i < row_start + 3; i++) {
for (int j = col_start; j < col_start + 3; j++) {
if (sudoku[i][j] == num) {
return false;
}
}
}
return true;
}
这部分代码实现了判断当前位置是否可以填入数字的功能。针对当前的行、列和所在小九宫格是否已经有了该数字进行检查,若均无该数字,则可以填入。
深度优先搜索
bool dfs(int row, int col)
{
if (row == N) { // 遍历到最后一个位置,数独已完成
return true;
}
if (col == N) { // 到达当前行的最后一列
return dfs(row + 1, 0); // 进入下一行的第一列
}
if (sudoku[row][col] != 0) { // 已有数字,跳过
return dfs(row, col + 1);
}
for (int i = 1; i <= N; i++) { // 尝试填入数字
if (can_fill(row, col, i)) {
sudoku[row][col] = i;
if (dfs(row, col + 1)) { // 继续处理下一列
return true; // 找到解,返回true
}
sudoku[row][col] = 0; // 没有找到解,回溯恢复原状
}
}
return false; // 当前位置无解
}
这部分代码实现了深度优先搜索。从递归调用的第一个格子开始搜索,一直填入数字,直到搜索到最后一格,数独已完成,返回true。若当前格子已有数字,跳过,进入下一格。如果当前格子没有填入数字,尝试填入1~9的数字。如果找到解,则返回true。如果当前位置无解,则回溯恢复原状,并返回false。
主函数
int main(void)
{
init_sudoku(); // 初始化数独
if (dfs(0, 0)) { // 深度优先搜索
printf("Solution:\n");
for (int i = 0; i < N; i++) { // 输出解
for (int j = 0; j < N; j++) {
printf("%d ", sudoku[i][j]);
}
putchar('\n');
}
} else { // 无解
printf("No solution.");
}
return 0;
}
这部分代码实现了主函数,通过调用初始化数独函数来获取数独矩阵。然后调用深度优先搜索函数进行搜索,并判断搜索是否成功。如果成功,则输出数独的解;如果失败,则输出“无解”。
示例说明
下面是两个用于说明的示例。
示例1
输入:
0 0 0 3 0 0 2 0 0
0 0 0 0 0 8 0 1 0
0 4 0 0 0 0 0 0 0
0 9 8 0 0 0 0 0 0
7 0 0 0 1 0 0 0 0
0 0 0 0 4 0 0 0 7
0 0 0 0 0 0 0 4 0
0 0 0 0 0 0 0 9 1
0 0 0 2 0 0 5 0 0
输出:
Solution:
6 7 1 3 5 9 2 8 4
5 3 9 4 2 8 7 1 6
8 4 2 7 6 1 9 5 3
4 9 8 1 7 5 3 6 2
7 2 3 9 1 4 8 0 0
1 5 6 8 4 3 0 2 7
9 1 7 5 8 2 4 0 6
2 8 5 6 3 7 0 9 1
3 6 4 2 9 0 5 7 8
示例2
输入:
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
输出:
No solution.
这个示例是最简单的数独,没有任何已知的数字,所以不存在解,输出“无解”。
希望以上分析能够对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言解数独程序的源码 - Python技术站