#ifndef SudokuMatrix_h #define SudokuMatrix_h #include #include /** * @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