|
|
|
|
#ifndef SudokuMatrix_h
|
|
|
|
|
#define SudokuMatrix_h
|
|
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <stdbool.h>
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 数独数组对象
|
|
|
|
|
* 这就是 C with Class!
|
|
|
|
|
* 创建对象:请调用 CreateMatrix 函数而不是直接创建一个结构体类型的对象。
|
|
|
|
|
* 因为纯C里头根本没有构造函数和析构函数用,只能手搓一个
|
|
|
|
|
* 注:由于纯C的内存管理实属烂到家,你需要在用完一个该对象后,主动调用本对象的析构函数
|
|
|
|
|
* (就是下面那个DeleteMatrix函数)来释放内存,否则会造成内存泄漏。
|
|
|
|
|
* 数独数组对象中所有内容均在堆上分配,以方便函数间传输。
|
|
|
|
|
*/
|
|
|
|
|
typedef struct SudokuMatrix{
|
|
|
|
|
int matrix[9][9];
|
|
|
|
|
} SudokuMatrix;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Create a Matrix object,无参数构造函数
|
|
|
|
|
*
|
|
|
|
|
* @return SudokuMatrix* 一个新的数独数组对象
|
|
|
|
|
*/
|
|
|
|
|
SudokuMatrix* CreateMatrix();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Create a Matrix From Array object 从一个二维数组创建一个数独数组对象。
|
|
|
|
|
* 数独数组的内容会从二维数组里头拷贝。
|
|
|
|
|
* @param matrix
|
|
|
|
|
* @return SudokuMatrix* 一个新的数独数组对象
|
|
|
|
|
*/
|
|
|
|
|
SudokuMatrix* CreateMatrixFromArray(int matrix[9][9]);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 析构函数
|
|
|
|
|
* 无论何时,当你用完一个 SudokuMatrix 对象后,都应该调用这个函数来释放内存。
|
|
|
|
|
*
|
|
|
|
|
* @param matrix
|
|
|
|
|
*/
|
|
|
|
|
void DeleteMatrix(SudokuMatrix *matrix);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 打印一个数独数组对象
|
|
|
|
|
* 以一个“看起来像数独”的形式打印出来。
|
|
|
|
|
* 具体实现请见 PrintMatrix.c 喵
|
|
|
|
|
*
|
|
|
|
|
* @param matrix
|
|
|
|
|
*/
|
|
|
|
|
void PrintMatrix(SudokuMatrix *matrix);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 将您输入的一个数独矩阵对象的内容随机化为0-9的数字
|
|
|
|
|
* 数组内任意一个元素x范围为:1<=x<=9;
|
|
|
|
|
* 数组每行仅有三个互不相同的数字x(x∈[1,9]) ,其他位置为数字0
|
|
|
|
|
* 数组中 1-3 行中包含了 1-9 中所有的 9 个数字,4-6 行和 7-9 行也分别是如此;
|
|
|
|
|
* 具体实现见 RandomMatrix.c 喵
|
|
|
|
|
* 警告:生成的数独矩阵仅仅满足上述要求;不保证有解。
|
|
|
|
|
*
|
|
|
|
|
* @param matrix 数独矩阵对象。请注意,该对象当前的内容会被舍弃。
|
|
|
|
|
*/
|
|
|
|
|
void RandomMatrix(SudokuMatrix *matrix);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 判断输入的数独矩阵是否符合数独的要求
|
|
|
|
|
* 数字 1-9 在每一行最多只能出现一次,不完整时可能是0或1次;
|
|
|
|
|
* 数字 1-9 在每一列最多只能出现一次,不完整时0或1次;
|
|
|
|
|
* 数字 1-9 在每一个被分隔开的 3x3 的矩阵内最多只能出现一次,不完整时0或1次;
|
|
|
|
|
* 请注意:本方法会输出矩阵,并且输出矩阵符合/不符合要求,如果不符合要求的话,以及其原因
|
|
|
|
|
* 警告:本方法仅仅会输出一个问题,即使数独矩阵中可能存在多个问题。
|
|
|
|
|
*
|
|
|
|
|
* @param matrix 判断的数独矩阵对象
|
|
|
|
|
* @return true 数独矩阵符合要求
|
|
|
|
|
* @return false 数独矩阵不符合要求
|
|
|
|
|
*/
|
|
|
|
|
bool JudgeMatrix(SudokuMatrix *matrix);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 填满一个不完整的数独矩阵
|
|
|
|
|
* 如果该矩阵不满足数独的要求,将不会进行求解
|
|
|
|
|
* 补全后的矩阵保存在 result 中。请注意,result 中当前的内容会被舍弃。
|
|
|
|
|
*
|
|
|
|
|
* @param matrix 不完整的数独矩阵
|
|
|
|
|
* @param result 补全后的数独矩阵
|
|
|
|
|
* @return true 补全成功
|
|
|
|
|
* @return false 补全失败(可能是因为无解,或者传入的矩阵不满足数独的要求)
|
|
|
|
|
*/
|
|
|
|
|
bool SolveMatrix(SudokuMatrix *matrix, SudokuMatrix *result);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif // SudokuMatrix_h
|