之前写过一个泛型栈,本例将利用这个泛型栈使用穷举法解数独游戏。基本思路是,通过数组建立两个矩阵,第一个保存数独题目,第二个保存哪些位置是题目给出的(置1),哪些位置是空白的需要解答的(置0)。通过初始化函数void sudoInit(int [9][9])对以上两个数组进行初始化。结构recorder用于记录通过验证的位置和答案,并将其入栈后遍历下一个位置,如此循环,最后得到解答。
关于泛型栈可参考:《C语言实现一个泛型栈》
更有效地算法参考:《更智能的解数独算法,让效率提升5倍!》
以下列出所定义的函数:
void sudoInit(int arr[9][9]); // 初始化数独数组
int verSquare(int y, int x); // 在9个小格组成的方块中验证(y, x)的值
int verRow(int y, int x); // 在每行中验证(y, x)的值
int verCol(int y, int x); // 在每列中验证(y, x)的值
int verify(int y, int x); // 验证一个位置
int verifyAll(); // 验证整个数组
void sudoPrt(); // 输出
void next(int *y, int *x); // 指向下一个位置
int sudoGo(int arr[9][9]); // Go
以下是源码:
#include <stdio.h>
#include "stack.h"
static int sudo[9][9]; // 记录数独
static int sudo2[9][9]; // 记录给出的数字和待解答的位置
typedef struct
{
int v; // 保存数字