用c++编写一个求解数独的程序
时间: 2024-02-18 17:35:18 浏览: 29
以下是一个简单的 C++ 数独求解程序,它使用递归算法和回溯技术:
```c++
#include<iostream>
using namespace std;
// 定义数独规格
#define N 9
// 打印数独矩阵
void print(int arr[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cout << arr[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
// 检查数独是否符合规则
bool check(int arr[N][N], int row, int col, int num) {
// 检查行
for (int i = 0; i < N; i++) {
if (arr[row][i] == num) {
return false;
}
}
// 检查列
for (int i = 0; i < N; i++) {
if (arr[i][col] == num) {
return false;
}
}
// 检查九宫格
int start_row = row - row % 3;
int start_col = col - col % 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (arr[start_row + i][start_col + j] == num) {
return false;
}
}
}
return true;
}
// 递归求解数独
bool solve(int arr[N][N], int row, int col) {
// 检查是否已经填满
if (row == N - 1 && col == N) {
return true;
}
// 到达行末,换到下一行
if (col == N) {
row++;
col = 0;
}
// 如果当前位置已经有数字,跳过
if (arr[row][col] > 0) {
return solve(arr, row, col + 1);
}
// 尝试填入数字
for (int i = 1; i <= N; i++) {
if (check(arr, row, col, i)) {
arr[row][col] = i;
if (solve(arr, row, col + 1)) {
return true;
}
}
arr[row][col] = 0;
}
return false;
}
int main() {
// 初始化数独矩阵
int arr[N][N] = {
{0, 0, 0, 0, 0, 0, 6, 8, 0},
{0, 0, 0, 0, 7, 3, 0, 0, 9},
{3, 0, 9, 0, 0, 0, 0, 4, 5},
{4, 9, 0, 0, 0, 0, 0, 0, 0},
{8, 0, 3, 0, 5, 0, 9, 0, 2},
{0, 0, 0, 0, 0, 0, 0, 3, 6},
{9, 6, 0, 0, 0, 0, 3, 0, 8},
{7, 0, 0, 6, 8, 0, 0, 0, 0},
{0, 2, 8, 0, 0, 0, 0, 0, 0}
};
// 求解数独
if (solve(arr, 0, 0)) {
// 打印解
print(arr);
} else {
cout << "无解!" << endl;
}
return 0;
}
```
这个程序使用了一个 `check` 函数来检查数独是否符合规则,一个 `solve` 函数来递归求解数独,以及一个 `main` 函数来初始化数独矩阵并调用 `solve` 函数。