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 著作权归作者所有。请勿转载和采集!