题解 | #Sudoku#DFS 回溯

Sudoku

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

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

const int row = 9;
const int column = 10;
array<array<bool, column>, row> checkr = {false};
array<array<bool, column>, row> checkc = {false};
array<array<bool, column>, row> checksub = {false};

bool dfs(vector<vector<int>>& arr, vector<pair<int, int>>& indexs, int index) {
    if (index == indexs.size()) {
        return true;
    }
    int i = indexs[index].first;
    int j = indexs[index].second;
    int subnum = i / 3 * 3 + j / 3;
    for (int num = 1; num <= 9; num++) {
        if (!checkr[i][num] && !checkc[j][num] && !checksub[subnum][num]) {
            checkr[i][num] = checkc[j][num] = checksub[subnum][num] = true;
            if (dfs(arr, indexs, index + 1)) {
                arr[i][j] = num;
                return true;
            }
            checkr[i][num] = checkc[j][num] = checksub[subnum][num] = false;
        }
    }
    return false;
}


int main() {
    vector<vector<int>> arr(9, vector<int>(9, 0));
    vector<pair<int, int>> indexs;
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            int n;
            cin >> n;
            arr[i][j] = n;
            if (n != 0) {
                checkr[i][n] = true;
                checkc[j][n] = true;
                checksub[i / 3 * 3 + j / 3][n] = true;
            } else {
                indexs.emplace_back(i, j);
            }
        }
    }
    dfs(arr, indexs, 0);
    for (auto& row : arr) {
        for (auto& col : row) {
            cout << col << ' ';
        }
        cout << endl;
    }

}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

shtdbb_:还不错,没有让你做了笔试再挂你
点赞 评论 收藏
分享
10-10 17:54
点赞 评论 收藏
分享
如题如果提出了一个薪资,A不成功,会有可能被取消offer吗
爱打瞌睡的柯基:最想去你们公司 但是别家开的高一些,希望能申请高一点 不管结果如何都谢谢你
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务