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.

160 lines
3.8 KiB

#include <stdio.h>
#include <stdbool.h>
bool checkRow(const char board[9][9], int row, char num) {
for (int col = 0; col < 9; col++) {
if (board[row][col] == num) {
return false;
}
}
return true;
}
bool checkCol(const char board[9][9], int col, char num) {
for (int row = 0; row < 9; row++) {
if (board[row][col] == num) {
return false;
}
}
return true;
}
bool checkBox(const char board[9][9], int startRow, int startCol, char num) {
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 3; col++) {
if (board[row + startRow][col + startCol] == num) {
return false;
}
}
}
return true;
}
bool isValidSudoku(const char board[9][9]) {
for (int row = 0; row < 9; row++) {
for (int col = 0; col < 9; col++) {
if (board[row][col]!= '.') {
char num = board[row][col];
if (!checkRow(board, row, num) ||
!checkCol(board, col, num) ||
!checkBox(board, row - row % 3, col - col % 3, num)) {
return false;
}
}
}
}
return true;
}
bool findEmptyCell(const char board[9][9], int *row, int *col) {
for (*row = 0; *row < 9; (*row)++) {
for (*col = 0; *col < 9; (*col)++) {
if (board[*row][*col] == '.') {
return true;
}
}
}
return false;
}
bool solveSudoku(char board[9][9]) {
int row, col;
if (!findEmptyCell(board, &row, &col)) {
return true;
}
for (char num = '1'; num <= '9'; num++) {
if (checkRow(board, row, num) &&
checkCol(board, col, num) &&
checkBox(board, row - row % 3, col - col % 3, num)) {
board[row][col] = num;
if (solveSudoku(board)) {
return true;
}
board[row][col] = '.';
}
}
return false;
}
void printSudokuMatrix(const char board[9][9]) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
}
int main() {
char board0[9][9] = {
{'5', '3', '.', '.', '7', '.', '.', '.', '.'},
{'6', '.', '.', '1', '9', '5', '.', '.', '.'},
{'.', '9', '8', '.', '.', '.', '.', '6', '.'},
{'8', '.', '.', '.', '6', '.', '.', '.', '3'},
{'4', '.', '.', '8', '.', '3', '.', '.', '1'},
{'7', '.', '.', '.', '2', '.', '.', '.', '6'},
{'.', '6', '.', '.', '.', '.', '2', '8', '.'},
{'.', '.', '.', '4', '1', '9', '.', '.', '5'},
{'.', '.', '.', '.', '8', '.', '.', '7', '9'}
};
char board1[9][9] = {
{'8', '3', '.', '.', '7', '.', '.', '.', '.'},
{'6', '.', '.', '1', '9', '5', '.', '.', '.'},
{'.', '9', '8', '.', '.', '.', '.', '6', '.'},
{'8', '.', '.', '.', '6', '.', '.', '.', '3'},
{'4', '.', '.', '8', '.', '3', '.', '.', '1'},
{'7', '.', '.', '.', '2', '.', '.', '.', '6'},
{'.', '6', '.', '.', '.', '.', '2', '8', '.'},
{'.', '.', '.', '4', '1', '9', '.', '.', '5'},
{'.', '.', '.', '.', '8', '.', '.', '7', '9'}
};
char board2[9][9] = {
{'5', '2', '.', '.', '7', '.', '.', '.', '.'},
{'6', '.', '.', '1', '9', '5', '.', '.', '.'},
{'.', '9', '8', '.', '.', '.', '.', '6', '.'},
{'8', '.', '.', '.', '6', '.', '.', '.', '3'},
{'4', '.', '.', '8', '.', '3', '.', '.', '1'},
{'7', '.', '.', '.', '2', '.', '.', '.', '6'},
{'.', '6', '.', '.', '.', '.', '2', '8', '.'},
{'.', '.', '.', '4', '1', '9', '.', '.', '5'},
{'.', '.', '.', '.', '8', '.', '.', '7', '9'}
};
printf("原始数独矩阵:\n");
printSudokuMatrix(board0);
if (isValidSudoku(board0)) {
printf("是数独矩阵\n");
if (solveSudoku(board0)) {
printf("数独矩阵的解是: \n");
printSudokuMatrix(board0);
} else {
printf("无解\n");
}
} else {
printf("不是数独矩阵\n");
printf("无解\n");
}
printf("原始数独矩阵:\n");
printSudokuMatrix(board1);
if (isValidSudoku(board1)) {
printf("是数独矩阵\n");
if (solveSudoku(board1)) {
printf("数独矩阵的解是: \n");
printSudokuMatrix(board1);
} else {
printf("无解\n");
}
} else {
printf("不是数独矩阵\n");
printf("无解\n");
}
printf("原始数独矩阵: \n");
printSudokuMatrix(board2);
if (isValidSudoku(board2)) {
printf("是数独矩阵\n");
if (solveSudoku(board2)) {
printf("数独矩阵的解是: \n");
printSudokuMatrix(board2);
} else {
printf("无解\n");
}
} else {
printf("不是数独矩阵\n");
printf("无解\n");
}
return 0;
}