C++代码实现 数独
以下是一个使用C++实现的数独求解程序:
#include <iostream>
using namespace std;
// 数独的维度
#define N 9
// 检查某个数字是否可以放置在指定的行、列和九宫格中
bool isSafe(int grid[N][N], int row, int col, int num) {
// 检查行是否安全
for (int i = 0; i < N; i++) {
if (grid[row][i] == num) {
return false;
}
}
// 检查列是否安全
for (int i = 0; i < N; i++) {
if (grid[i][col] == num) {
return false;
}
}
// 检查九宫格是否安全
int startRow = row - row % 3;
int startCol = col - col % 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (grid[i + startRow][j + startCol] == num) {
return false;
}
}
}
return true;
}
// 在数独中查找未填入数字的位置
bool findUnassignedLocation(int grid[N][N], int& row, int& col) {
for (row = 0; row < N; row++) {
for (col = 0; col < N; col++) {
if (grid[row][col] == 0) {
return true;
}
}
}
return false;
}
// 使用回溯法解决数独
bool solveSudoku(int grid[N][N]) {
int row, col;
if (!findUnassignedLocation(grid, row, col)) {
return true; // 数独已经解决
}
// 尝试填入数字
for (int num = 1; num <= 9; num++) {
if (isSafe(grid, row, col, num)) {
grid[row][col] = num;
if (solveSudoku(grid)) {
return true;
}
grid[row][col] = 0; // 回溯
}
}
return false;
}
// 打印数独
void printSudoku(int grid[N][N]) {
for (int row = 0; row < N; row++) {
for (int col = 0; col < N; col++) {
cout << grid[row][col] << " ";
}
cout << endl;
}
}
int main() {
int grid[N][N] = {
{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}
};
if (solveSudoku(grid)) {
cout << "数独的解为:" << endl;
printSudoku(grid);
} else {
cout << "数独无解" << endl;
}
return 0;
}
这个程序使用回溯法来解决数独问题。首先,定义了一个isSafe
函数来检查某个数字是否可以放置在指定的行、列和九宫格中。然后,定义了一个findUnassignedLocation
函数来在数独中查找未填入数字的位置。接下来,定义了一个solveSudoku
函数来使用回溯法解决数独问题。最后,定义了一个printSudoku
函数来打印数独。
在main
函数中,我们提供了一个数独的初始状态作为输入,并调用solveSudoku
函数来求解数独。如果数独有解,则打印解;否则,打印"数独无解"
原文地址: https://cveoy.top/t/topic/hR7L 著作权归作者所有。请勿转载和采集!