题解 | #Sudoku#

Sudoku

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

#include <iostream>
#include <vector>
#include <array>
using namespace std;

bool dfs(vector<vector<int> >& m, vector<array<int, 2>>& toFill, int k) {
    if (k >= toFill.size())
        return true;
    array<int, 9> t = {0};
    auto pos = toFill[k];
    vector<int> val;
    //同一行
    for (auto& c : m[pos[0]])
        if (c) t[c - 1]++;
    //同一列
    for (auto& r : m)
        if (r[pos[1]]) t[r[pos[1]] - 1]++;
    //小方框内
    for (int i = pos[0] - pos[0] % 3; i < pos[0] - pos[0] % 3 + 3; ++i)
        for (int j = pos[1] - pos[1] % 3; j < pos[1] - pos[1] % 3 + 3; ++j)
            if (m[i][j])
                t[m[i][j] - 1]++;
    //所有可能的取值
    for (int i = 0; i < t.size(); ++i)
        if (!t[i]) val.push_back(i + 1);
    if (val.empty())
        return false;
    for (int v : val) {
        m[pos[0]][pos[1]] = v;
        if (dfs(m, toFill, k + 1)) {
            return true;
        }
        m[pos[0]][pos[1]] = 0;
    }
    return false;
}

int main() {

    vector<vector<int>> m(9, vector<int>(9, 0));
    vector<array<int, 2>> toFill;

    for (int i = 0; i < m.size(); ++i)
        for (int j = 0; j < m[0].size(); ++j) {
            cin >> m[i][j];
            if (!m[i][j])
                toFill.push_back({i, j});
        }
    dfs(m, toFill, 0);
    for (int i = 0; i < m.size(); ++i) {
        for (int j = 0; j < m[0].size(); ++j)
            cout << m[i][j] << ' ';
        cout << '\n';
    }
    return 0;
}

dfs深度优先搜索

全部评论

相关推荐

hso_:哈哈哈哈哈哈我没offer一样在同一道题开喷了
投递深圳同为数码等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务