题解 | #Sudoku# 位运算+DFS+回溯

Sudoku

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

#include <iostream>
using namespace std;
char board[9][9];
int rs[9], cs[9], bs[9];
void set(int i, int j, int b, int n) {
    rs[i] |= (1 << n), cs[j] |= (1 << n), bs[b] |= (1 << n);
}
void reset(int i, int j, int b, int n) {
    rs[i] ^= (1 << n), cs[j] ^= (1 << n), bs[b] ^= (1 << n);
}
bool dfs(int i, int j) {
    if (j == 9) return dfs(i + 1, 0);
    if (i == 9) return true;
    if (board[i][j] != '0') return dfs(i, j + 1);
    for (int k = 1; k <= 9; ++k) { 
        int b = i / 3 * 3 + j / 3;
        if (!(rs[i] >> k & 1) && !(cs[j] >> k & 1) && !(bs[b] >> k & 1)) {
            set(i, j, b, k);
            board[i][j] = k + '0';
            if (dfs(i, j + 1)) return true;
            board[i][j] = '0';
            reset(i, j, b, k);
        }
    }
    return false;
}
int main() {
    for (int i = 0; i < 9; ++i) {
        for (int j = 0; j < 9; ++j) {
            cin >> board[i][j]; 
            if (board[i][j] != '0')
                set(i, j, i / 3 * 3 + j / 3, board[i][j] - '0');
        }
    }
    dfs(0, 0);
    for (int i = 0; i < 9; ++i) {
        for (int j = 0; j < 9; ++j) {
            if (j != 0) cout << " ";
            cout << board[i][j];
        }
        cout << endl;
    }
    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

点赞 评论 收藏
分享
10-14 12:20
门头沟学院 Java
迷茫的大四🐶:摊牌了,我是25届的,你们也不招我
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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