37 条题解

  • 0
    @ 2025-7-21 15:05:11
    #include <iostream>
    using namespace std;
    
    // 检查数字num是否可以放在(row,col)位置
    bool isSafe(int grid[9][9], int row, int col, int num) {
        // 检查行
        for (int d = 0; d < 9; d++) {
            if (grid[row][d] == num) {
                return false;
            }
        }
        
        // 检查列
        for (int r = 0; r < 9; r++) {
            if (grid[r][col] == num) {
                return false;
            }
        }
        
        // 检查3x3小格子
        int boxStartRow = row - row % 3;
        int boxStartCol = col - col % 3;
        for (int r = boxStartRow; r < boxStartRow + 3; r++) {
            for (int d = boxStartCol; d < boxStartCol + 3; d++) {
                if (grid[r][d] == num) {
                    return false;
                }
            }
        }
        
        return true;
    }
    
    // 数独求解函数
    bool solveSudoku(int grid[9][9]) {
        int row, col;
        
        // 检查是否还有空格
        bool isEmpty = false;
        for (row = 0; row < 9; row++) {
            for (col = 0; col < 9; col++) {
                if (grid[row][col] == 0) {
                    isEmpty = true;
                    break;
                }
            }
            if (isEmpty) {
                break;
            }
        }
        
        // 如果没有空格了,数独已解
        if (!isEmpty) {
            return true;
        }
        
        // 尝试填入数字1-9
        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 printGrid(int grid[9][9]) {
        for (int row = 0; row < 9; row++) {
            for (int col = 0; col < 9; col++) {
                cout << grid[row][col];
                if (col != 8) {
                    cout << " ";
                }
                // 九宫格之间加三个空格
                if (col == 2 || col == 5) {
                    cout << "   ";
                }
            }
            cout << endl;
            // 九宫格之间加空行
            if (row == 2 || row == 5) {
                cout << endl;
            }
        }
    }
    
    int main() {
        int grid[9][9];
        
        // 读取输入
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                cin >> grid[i][j];
            }
        }
        
        if (solveSudoku(grid)) {
            printGrid(grid);
        } else {
            cout << "无解" << endl;
        }
        
        return 0;
    }
    
    

    信息

    ID
    1
    时间
    1000ms
    内存
    128MiB
    难度
    1
    标签
    递交数
    4607
    已通过
    1304
    上传者