题解 | #Sudoku#

Sudoku

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

#include <iostream>
#include <vector>
using namespace std;
int find_answer_ok = 0;

vector< vector<int>> sudo(9, vector<int>(9, 0));
vector< vector<int>> zerr;
int num;
bool check(int step, int k) {
    int m = zerr[step][0];
    int n = zerr[step][1];

    for (int i = 0; i < 9; i++) {
        if (sudo[m][i] == k)
            return false;
    }
    for (int i = 0; i < 9; i++) {
        if (sudo[i][n] == k)
            return false;
    }
    int m_start = m / 3 * 3;
    int n_start = n / 3 * 3;

    for (int i = m_start; i < m_start + 3; i++) {
        for (int j = n_start; j < n_start + 3; j++) {
            if (sudo[i][j] == k) {							//			存放需要填的位置
                return false;
            }
        }
    }
    return true;
}
void DFS(int step) {
    if (step == num) {
        find_answer_ok = 1;
        return;
    }

    int m = zerr[step][0];
    int n = zerr[step][1];

    for (int k = 1; k <= 9; k++) {
        if (check(step, k)) {
            sudo[m][n] = k;
            DFS(step + 1);
            if(find_answer_ok)     //找到直接return;
            {
                return;
            }
            sudo[m][n] = 0;			//找不到继续回溯
        }

    }
    return;
}
int main() {

    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            cin >> sudo[i][j];
            if (sudo[i][j] == 0) {
                zerr.push_back({i, j});
            }
        }
    }
    num = zerr.size();

    DFS(0);

    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            cout<<sudo[i][j]<<' ';
        }
        cout<<endl;
    }



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

全部评论

相关推荐

点赞 评论 收藏
分享
大摆哥:刚好要做个聊天软件,直接让你帮他干活了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务