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.
238 lines
7.0 KiB
238 lines
7.0 KiB
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdbool.h>
|
|
#include <time.h>
|
|
|
|
|
|
void boradprint(int** board) {
|
|
printf("|-----------------------|\n");
|
|
for (int row = 0; row < 9; row++) {
|
|
if (row == 3 || row == 6) {
|
|
printf("|-----------------------|\n");
|
|
}
|
|
printf("| ");
|
|
for (int col = 0; col < 9; col++) {
|
|
if (board[row][col] == 0) {
|
|
printf(". ");
|
|
}
|
|
else {
|
|
printf("%d ", board[row][col]);
|
|
}
|
|
if (col == 2 || col == 5) {
|
|
printf("| ");
|
|
}
|
|
}
|
|
printf("|\n");
|
|
}
|
|
printf("|-----------------------|\n");
|
|
}
|
|
|
|
void freeBoard(int** board, int rows) {
|
|
for (int i = 0; i < rows; i++) {
|
|
free(board[i]); // 释放每一行的内存
|
|
}
|
|
free(board); // 释放指向行的指针数组的内存
|
|
}
|
|
|
|
bool isVaild(int** borad)
|
|
{
|
|
printf("The original Sudoku matrix: \n");
|
|
boradprint(borad);
|
|
int row_count = 0;
|
|
int col_count = 0;
|
|
int col_true[10] = { 0 };
|
|
int row_true[10] = { 0 };
|
|
while (row_count != 9)
|
|
{
|
|
for (int i = 0; i < 9; i++)//every raw
|
|
{
|
|
if (borad[row_count][i] > 0) //if it has define
|
|
{
|
|
if (!col_true[borad[row_count][i]])//check
|
|
{
|
|
col_true[borad[row_count][i]] = 1;
|
|
}
|
|
else
|
|
{
|
|
printf("False:Invalid initial Sudoku matrix!\n");
|
|
printf("The number %d in the col %d has been used!\n", borad[row_count][i], row_count + 1);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
row_count++;
|
|
for (int i = 0; i <= 9; i++)col_true[i] = 0;
|
|
}
|
|
while (col_count != 9)
|
|
{
|
|
for (int i = 0; i < 9; i++)//every col
|
|
{
|
|
if (borad[i][col_count]) //if it has define
|
|
{
|
|
if (!row_true[borad[i][col_count]])//check
|
|
{
|
|
row_true[borad[i][col_count]] = 1;
|
|
}
|
|
else
|
|
{
|
|
printf("False:Invalid initial Sudoku matrix!\n");
|
|
printf("The number %d in the col %d has been used!\n", borad[i][col_count], col_count + 1);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
col_count++;
|
|
for (int i = 0; i < 10; i++)row_true[i] = 0;
|
|
}
|
|
row_count = col_count = 0;
|
|
int block_count = 1;
|
|
int block_group[10] = { 0 };
|
|
int block_row = (row_count / 3) * 3;
|
|
int block_col = (col_count / 3) * 3;
|
|
while (block_count != 9)
|
|
{
|
|
for (int i = block_row; i < block_row + 3; i++)
|
|
for (int j = block_col; j < block_col + 3; j++)
|
|
if (borad[i][j])
|
|
if (!block_group[borad[i][j]])block_group[borad[i][j]] = 1;
|
|
else
|
|
{
|
|
printf("False:Invalid initial Sudoku matrix!\n");
|
|
printf("The number %d in the block %d has been used!\n", borad[i][j], block_count);
|
|
return false;
|
|
}
|
|
block_count++;
|
|
for (int i = 0; i < 10; i++)
|
|
{
|
|
block_group[i] = 0;
|
|
}
|
|
switch (block_count)
|
|
{
|
|
case 2:block_row = 0; block_col = 3; break;
|
|
case 3:block_row = 0; block_col = 6; break;
|
|
case 4:block_row = 3; block_col = 0; break;
|
|
case 5:block_row = 3; block_col = 3; break;
|
|
case 6:block_row = 3; block_col = 6; break;
|
|
case 7:block_row = 6; block_col = 0; break;
|
|
case 8:block_row = 6; block_col = 3; break;
|
|
case 9:block_row = 6; block_col = 6; break;
|
|
default:return false;
|
|
}
|
|
}
|
|
printf("True:Valid initial Sudoku matrix!\n");
|
|
return true;
|
|
}
|
|
|
|
int** boradgenerate() {
|
|
int count_col = 0;
|
|
int count_row = 0;
|
|
int col[3] = { 0 };
|
|
int num_true[9] = { 0 };
|
|
int col_true[9] = { 0 };
|
|
int** borad;
|
|
borad = (int**)malloc(9 * sizeof(int*));
|
|
for (int i = 0; i < 9; i++)
|
|
borad[i] = (int*)malloc(9 * sizeof(int));
|
|
for (int i = 0; i < 9; i++)
|
|
for (int j = 0; j < 9; j++)
|
|
borad[i][j] = 0;
|
|
for (count_row = 0; count_row <= 8; count_row++) {
|
|
if (count_row % 3 == 0)
|
|
for (int i = 0; i < 9; i++)
|
|
num_true[i] = 0;
|
|
while (count_col != 3)
|
|
{
|
|
int num = rand() % 9;
|
|
if (!col_true[num]) {
|
|
col[count_col++] = num;
|
|
col_true[num] = 1;
|
|
}
|
|
}
|
|
count_col = 0;
|
|
for (int i = 0; i < 9; i++)
|
|
col_true[i] = 0;
|
|
while (count_col != 3)
|
|
{
|
|
int num = rand() % 9;
|
|
if (!num_true[num]) {
|
|
borad[count_row][col[count_col++]] = num + 1;
|
|
num_true[num] = 1;
|
|
}
|
|
}
|
|
count_col = 0;
|
|
}
|
|
return borad;
|
|
}
|
|
|
|
int** change(int board[][9]) {
|
|
int** doublePointer = (int**)malloc(9 * sizeof(int*));
|
|
for (int i = 0; i < 9; i++) {
|
|
doublePointer[i] = (int*)malloc(9 * sizeof(int));
|
|
for (int j = 0; j < 9; j++) {
|
|
doublePointer[i][j] = board[i][j];
|
|
}
|
|
}
|
|
return doublePointer;
|
|
}
|
|
|
|
bool solveborad(int** borad)
|
|
{
|
|
printf("The original Sudoku matrix: \n");
|
|
isVaild(borad);
|
|
int** temp_borad = borad;
|
|
for (int i = 0; i < 9; i++)
|
|
{
|
|
for (int j = 0; j < 9; j++)
|
|
{
|
|
if (!borad[i][j]) {
|
|
int temp = borad[i][j];
|
|
for (int k = 1; k < 10; k++)
|
|
{
|
|
temp_borad[i][j] = k;
|
|
if (isVaild(temp_borad))
|
|
{
|
|
borad[i][j] = k;
|
|
if (solveborad(borad))
|
|
{
|
|
printf("True:Valid initial Sudoku matrix!\n");
|
|
boradprint(borad);
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
borad[i][j] = temp;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
temp_borad[i][j] = temp;
|
|
}
|
|
}
|
|
printf("No solution");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
printf("True:Valid initial Sudoku matrix!");
|
|
}
|
|
|
|
int main() {
|
|
srand(time(NULL));
|
|
int board1[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** board2 = change(board1);
|
|
solveborad(board2);
|
|
return 0;
|
|
}
|