parent
6b48a3068f
commit
020940d788
@ -0,0 +1,4 @@
|
||||
.DS_Store
|
||||
*.o
|
||||
.vscode
|
||||
SudokuMatrix
|
@ -0,0 +1,23 @@
|
||||
SudokuMatrix: PrintMatrix.o main.o SudokuMatrix.o RandomMatrix.o JudgeMatrix.o SolveMatrix.o
|
||||
gcc -o SudokuMatrix main.o PrintMatrix.o SudokuMatrix.o RandomMatrix.o JudgeMatrix.o SolveMatrix.o
|
||||
|
||||
main.o: main.c SudokuMatrix.o
|
||||
gcc -c -o main.o main.c
|
||||
|
||||
PrintMatrix.o: PrintMatrix.c SudokuMatrix.o
|
||||
gcc -c -o PrintMatrix.o PrintMatrix.c
|
||||
|
||||
RandomMatrix.o: RandomMatrix.c SudokuMatrix.o
|
||||
gcc -c -o RandomMatrix.o RandomMatrix.c
|
||||
|
||||
JudgeMatrix.o: JudgeMatrix.c SudokuMatrix.o
|
||||
gcc -c -o JudgeMatrix.o JudgeMatrix.c
|
||||
|
||||
SolveMatrix.o: SolveMatrix.c SudokuMatrix.o
|
||||
gcc -c -o SolveMatrix.o SolveMatrix.c
|
||||
|
||||
SudokuMatrix.o : SudokuMatrix.h SudokuMatrix.c
|
||||
gcc -c -o SudokuMatrix.o SudokuMatrix.c
|
||||
|
||||
clean:
|
||||
rm -rf *.o SudokuMatrix
|
@ -0,0 +1,21 @@
|
||||
#include "SudokuMatrix.h"
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
void PrintMatrix(SudokuMatrix *matrix){
|
||||
for (int i=0;i<9;i++){
|
||||
if (i == 0 || i == 3 || i == 6){
|
||||
printf("|-----------------------------|\n");
|
||||
}
|
||||
for (int j=0;j<9;j++){
|
||||
if (j == 0 || j == 3 || j == 6){
|
||||
printf("|");
|
||||
}
|
||||
printf(" %d ",matrix->matrix[i][j]);
|
||||
}
|
||||
// 打印最后一列的竖线
|
||||
printf("|\n");
|
||||
}
|
||||
// 打印尾巴那行
|
||||
printf("|-----------------------------|\n");
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
#include "SudokuMatrix.h"
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
/**
|
||||
* @brief 交换两个整数的值
|
||||
*
|
||||
* @param a 一个整数的地址
|
||||
* @param b 另一个整数的地址
|
||||
*/
|
||||
void Swap(int*a, int *b){
|
||||
int temp = *a;
|
||||
*a = *b;
|
||||
*b = temp;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief 将一个 int 数组的内容随机打乱
|
||||
*
|
||||
* @param array 需要打乱的数组
|
||||
* @param length 数组的长度
|
||||
*/
|
||||
void Shuffle(int* array, int length){
|
||||
if (length != 0){
|
||||
for (int i = length - 1; i > 0; i--) {
|
||||
int j = rand() % (i + 1);
|
||||
Swap(&array[i], &array[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void RandomMatrix(SudokuMatrix* matrix){
|
||||
int random_row[9] = {1,2,3,4,5,6,7,8,9};
|
||||
int random_place[9] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
|
||||
|
||||
// 重置矩阵内容为全0
|
||||
for (int i=0;i<9;i++){
|
||||
for (int j=0;j<9;j++){
|
||||
matrix->matrix[i][j] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=0;i<3;i++){
|
||||
// 先生成这九个数的顺序,再随机生成这九个数应该在哪里。
|
||||
Shuffle(random_row,9);
|
||||
for (int j=0;j<3;j++){
|
||||
Shuffle(random_place,9);
|
||||
for (int k=0;k<3;k++){
|
||||
matrix->matrix[i*3+j][random_place[k]] = random_row[j*3+k];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
#include "SudokuMatrix.h"
|
||||
|
||||
SudokuMatrix* CreateMatrix(){
|
||||
SudokuMatrix *matrix = (SudokuMatrix*)malloc(sizeof(SudokuMatrix));
|
||||
// 初始化这个数组里的数为0
|
||||
for (int i=0;i<9;i++){
|
||||
for (int j=0;j<9;j++){
|
||||
matrix->matrix[i][j] = 0;
|
||||
}
|
||||
}
|
||||
return matrix;
|
||||
}
|
||||
|
||||
SudokuMatrix* CreateMatrixFromArray(int matrix[9][9]){
|
||||
SudokuMatrix *newMatrix = CreateMatrix();
|
||||
// 拷贝内部的数组为输入的数组
|
||||
for(int i=0; i<9; i++){
|
||||
for(int j=0; j<9; j++){
|
||||
newMatrix->matrix[i][j] = matrix[i][j];
|
||||
}
|
||||
}
|
||||
return newMatrix;
|
||||
}
|
||||
|
||||
void DeleteMatrix(SudokuMatrix *matrix){
|
||||
// 释放整个结构体
|
||||
if (matrix != NULL)
|
||||
{
|
||||
free(matrix);
|
||||
}
|
||||
}
|
@ -0,0 +1,85 @@
|
||||
#include "SudokuMatrix.h"
|
||||
#include <time.h>
|
||||
|
||||
|
||||
/**
|
||||
* @brief 测试随机生成数独矩阵
|
||||
*/
|
||||
void testRandomMatrix(){
|
||||
SudokuMatrix* matrix = CreateMatrix();
|
||||
RandomMatrix(matrix);
|
||||
PrintMatrix(matrix);
|
||||
DeleteMatrix(matrix);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief 测试判断数独矩阵的函数
|
||||
*
|
||||
*/
|
||||
void testJudgeMatrix(){
|
||||
SudokuMatrix* matrix = CreateMatrix();
|
||||
RandomMatrix(matrix);
|
||||
JudgeMatrix(matrix);
|
||||
DeleteMatrix(matrix);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 测试求解数独矩阵的函数
|
||||
*
|
||||
* @param matrix_used 0: board0; 1: board1; 2: board2
|
||||
*/
|
||||
void testSolveMatrix(int matrix_used){
|
||||
int board0[9][9] = {{5, 3, 0, 0, 7, 0, 0, 0, 0},
|
||||
{6, 0, 0, 1, 9, 5, 0, 0, 0},
|
||||
{0, 9, 8, 0, 0, 0, 0, 6, 0},
|
||||
{8, 0, 0, 0, 6, 0, 0, 0, 3},
|
||||
{4, 0, 0, 8, 0, 3, 0, 0, 1},
|
||||
{7, 0, 0, 0, 2, 0, 0, 0, 6},
|
||||
{0, 6, 0, 0, 0, 0, 2, 8, 0},
|
||||
{0, 0, 0, 4, 1, 9, 0, 0, 5},
|
||||
{0, 0, 0, 0, 8, 0, 0, 7, 9}};
|
||||
int board1[9][9] = {{8, 3, 0, 0, 7, 0, 0, 0, 0},
|
||||
{6, 0, 0, 1, 9, 5, 0, 0, 0},
|
||||
{0, 9, 8, 0, 0, 0, 0, 6, 0},
|
||||
{8, 0, 0, 0, 6, 0, 0, 0, 3},
|
||||
{4, 0, 0, 8, 0, 3, 0, 0, 1},
|
||||
{7, 0, 0, 0, 2, 0, 0, 0, 6},
|
||||
{0, 6, 0, 0, 0, 0, 2, 8, 0},
|
||||
{0, 0, 0, 4, 1, 9, 0, 0, 5},
|
||||
{0, 0, 0, 0, 8, 0, 0, 7, 9}};
|
||||
int board2[9][9] = {{5, 2, 0, 0, 7, 0, 0, 0, 0},
|
||||
{6, 0, 0, 1, 9, 5, 0, 0, 0},
|
||||
{0, 9, 8, 0, 0, 0, 0, 6, 0},
|
||||
{8, 0, 0, 0, 6, 0, 0, 0, 3},
|
||||
{4, 0, 0, 8, 0, 3, 0, 0, 1},
|
||||
{7, 0, 0, 0, 2, 0, 0, 0, 6},
|
||||
{0, 6, 0, 0, 0, 0, 2, 8, 0},
|
||||
{0, 0, 0, 4, 1, 9, 0, 0, 5},
|
||||
{0, 0, 0, 0, 8, 0, 0, 7, 9}};
|
||||
|
||||
SudokuMatrix* matrix;
|
||||
switch (matrix_used){
|
||||
case 0:
|
||||
matrix = CreateMatrixFromArray(board0);
|
||||
break;
|
||||
case 1:
|
||||
matrix = CreateMatrixFromArray(board1);
|
||||
break;
|
||||
case 2:
|
||||
matrix = CreateMatrixFromArray(board2);
|
||||
break;
|
||||
}
|
||||
SudokuMatrix* result = CreateMatrix();
|
||||
SolveMatrix(matrix, result);
|
||||
DeleteMatrix(matrix);
|
||||
DeleteMatrix(result);
|
||||
}
|
||||
|
||||
|
||||
int main(){
|
||||
// 初始化随机数种子
|
||||
srand(time(NULL));
|
||||
// 自选你要调用(用来测试)的函数
|
||||
testSolveMatrix(0);
|
||||
}
|
Loading…
Reference in new issue