题解 | #Sudoku#

Sudoku

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

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

const int N = 15;
int mp[N][N];
bool find_answer_ok = false;

bool check(int row, int col, int val){
    //同行
    for(int i = 0; i < 9; i++){
        if(mp[row][i] == val){
            return false;
        }
    }
    //同列
    for(int i = 0; i < 9; i++){
        if(mp[i][col] == val){
            return false;
        }
    }
    //同一个九宫格
    int limit_row = row / 3 * 3 + 3;
    int limit_col = col / 3 * 3 + 3;
    for(int i = limit_row - 3; i < limit_row; i++){
        for(int j = limit_col - 3; j < limit_col; j++){
            if(mp[i][j] == val){
                return false;
            }
        }
    }
    return true;
}

void dfs(int row, int col){    //当前的行和列
    if(col == 9){
        row++;
        col = 0;
    }
    if(row == 9 && col == 0){
        find_answer_ok = true;
        return ;
    }
    if(mp[row][col] == 0){
        for(int i = 1; i <= 9; i++){
            if(check(row, col, i)){
                mp[row][col] = i;
                dfs(row, col + 1);
                if(find_answer_ok){
                    return ;
                }
                mp[row][col] = 0;
            }
            
        }
    }
    else{
        dfs(row, col + 1);
    }
}

int main(){
    for(int i = 0; i < 9; i++){
        for(int j = 0; j < 9; j++){
            cin >> mp[i][j];
        }
    }
    dfs(0, 0);    //起点坐标(0,0)
    for(int i = 0; i < 9; i++){
        for(int j = 0; j < 9; j++){
            cout << mp[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}
全部评论

相关推荐

qq乃乃好喝到咩噗茶:院校后面加上211标签,放大加粗,招呼语也写上211
点赞 评论 收藏
分享
运营你豪哥:简历改改吧-非本、求职意向技术岗、无实习经历、内容空洞 如果简历不爆改的话,应该是会持续崩溃了 1.把你教育经历放最下面去 2.蓝底照片很奇怪哈,感觉还在高中时代,建议白底重新拍一下 3.校园经历没啥必要,收集和反馈同学们对产品的意见,解决学生和老师之间的沟通,企业招聘不看这些哈 好好思考一下简历的设计和你要表达的重点,再去投简历
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-19 14:35
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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