题解 | #Sudoku# c++ 回溯

Sudoku

http://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1

#include<bits/stdc++.h>
using namespace std;
vector<vector<int>> board(9, vector<int>(9));

bool isValid(int row, int col, int val, vector<vector<int>>& board) {
    for (int i = 0; i < 9; ++i) {// 判断行里是否重复
        if (board[row][i] == val) {
            return false;
        }
    }
    for (int j = 0; j < 9; ++j) {// 判断列里是否重复
        if (board[j][col] == val) {
            return false;
        }
    }
    int startRow = (row / 3) * 3;
    int startCol = (col / 3) * 3;
    for (int i = startRow; i < startRow + 3; ++i) {// 判断9方格里是否重复
        for (int j = startCol; j < startCol + 3; ++j) {
            if (board[i][j] == val) {
                return false;
            }
        }
    }
    return true;
}


bool backtrack(vector<vector<int>>& board) {
    for (int i = 0; i < 9; ++i) {// 遍历行
        for (int j = 0; j < 9; ++j) {// 遍历列
            if (board[i][j] != 0) {
                continue;
            }
            for (int k = 1; k <= 9; ++k) {// (i, j) 这个位置放k是否合适
                if (isValid(i, j, k, board)) { 
                    board[i][j] = k; // 放置k
                    if (backtrack(board)) { 
                        return true;// 如果找到合适一组立刻返回
                    }
                    board[i][j] = 0;// 回溯,撤销k
                }
            }
            return false;// 9个数都试完了,都不行,那么就返回false
        }
    }
    return true;
}


int main() {
    for (int i = 0; i < 9; ++i) {
        for (int j = 0; j < 9; ++j) {
            cin >> board[i][j];
        }
    }

    backtrack(board);

    for (int i = 0; i < 9; ++i) {
        for (int j = 0; j < 9; ++j) {
            if (j == 8) {
                cout << board[i][j];
            } else {
                cout << board[i][j] << ' ';
            }
        }
        cout << endl;
    }
    return 0;
}
全部评论
该牛油正在参与牛客写题解薅羊毛的活动,牛币,周边,京东卡超多奖品放送,活动进入倒计时!快来捡漏啦https://www.nowcoder.com/discuss/888949?source_id=profile_create_nctrack&channel=-1
点赞 回复 分享
发布于 2022-04-27 12:12

相关推荐

不愿透露姓名的神秘牛友
07-15 17:24
点赞 评论 收藏
分享
06-07 19:59
门头沟学院 C++
补药卡我啊😭:都快15年前的了还在11新特性
你的简历改到第几版了
点赞 评论 收藏
分享
07-14 12:29
门头沟学院 Java
后端岗,实习三周感觉有点想跑路了,担心秋招被拉黑,有没有佬是字节HR知道情况的
从零开始的转码生活:你实习三周都想跑路,将来拿到offer真的愿意在这干十几二十年吗
投递字节跳动等公司7个岗位
点赞 评论 收藏
分享
评论
3
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务