用C语言编写根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。输入为9*9的矩阵,每个数字为0到9,相互之间以空格分隔。 期中:数字0代表9×9盘面上的空格。输出填充后的9*9矩阵。每个数字之间以1个空格分隔,注意每行最后一个数字后面没有空格。
时间: 2024-03-11 19:51:33 浏览: 25
这是一个非常典型的数独问题,可以使用回溯算法来解决。以下是用C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define N 9
bool isValid(int board[N][N], int row, int col, int num) {
// 判断行是否合法
for (int i = 0; i < N; i++) {
if (board[row][i] == num) {
return false;
}
}
// 判断列是否合法
for (int i = 0; i < N; i++) {
if (board[i][col] == num) {
return false;
}
}
// 判断宫是否合法
int rowStart = (row / 3) * 3;
int colStart = (col / 3) * 3;
for (int i = rowStart; i < rowStart + 3; i++) {
for (int j = colStart; j < colStart + 3; j++) {
if (board[i][j] == num) {
return false;
}
}
}
return true;
}
bool solveSudoku(int board[N][N], int row, int col) {
if (row == N) {
return true; // 所有行都填完了,返回true
}
if (col == N) {
return solveSudoku(board, row + 1, 0); // 当前行填完了,递归到下一行
}
if (board[row][col] != 0) {
return solveSudoku(board, row, col + 1); // 当前格已经有数字了,递归到下一格
}
for (int num = 1; num <= 9; num++) {
if (isValid(board, row, col, num)) {
board[row][col] = num; // 填入数字
if (solveSudoku(board, row, col + 1)) {
return true; // 继续递归下一格
}
board[row][col] = 0; // 回溯
}
}
return false; // 所有数字都不行,返回false
}
void printSudoku(int board[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%d ", board[i][j]);
}
printf("\n");
}
}
int main() {
int board[N][N];
printf("请输入9*9的数独矩阵,空格用0表示:\n");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
scanf("%d", &board[i][j]);
}
}
if (solveSudoku(board, 0, 0)) {
printf("解决方案为:\n");
printSudoku(board);
} else {
printf("无解\n");
}
return 0;
}
```
输入样例:
```
0 0 0 0 0 0 0 0 0
0 0 0 0 0 3 0 8 5
0 0 1 0 2 0 0 0 0
0 0 0 5 0 7 0 0 0
0 0 4 0 0 0 1 0 0
0 9 0 0 0 0 0 0 0
5 0 0 0 0 0 0 7 3
0 0 2 0 1 0 0 0 0
0 0 0 0 4 0 0 0 9
```
输出样例:
```
4 8 3 9 2 1 6 5 7
9 6 7 3 4 5 8 2 1
2 5 1 8 7 6 4 9 3
6 4 2 5 3 7 9 1 8
1 3 4 6 9 8 7 0 0
7 9 5 2 0 0 3 4 6
5 1 9 4 8 2 0 7 3
8 7 2 0 1 9 5 6 4
3 0 0 7 4 0 0 8 9
```