You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
3.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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
* 数组每行仅有三个互不相同的数字xx∈[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