题解 | #Sudoku#

Sudoku

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

#include <bits/stdc++.h>
using namespace std;
int cnt_line[9][10];
int cnt_row[9][10];
int matrix[9][9];
int cnt_3[3][3][10];
int sz;
vector<pair<int,int> > blank;

bool isLegal(int i,int j,int num){//判断填入当前数字num是否合法
    if(!cnt_line[i][num]&&!cnt_row[j][num]&&!cnt_3[i/3][j/3][num])
        return true;
    return false;
}
bool dfs(int i,int j,int k){
    int t=1;
    for(t=1;t<=9;t++){
        if(isLegal(i, j, t)&&k<sz){
            matrix[i][j]=t;
            cnt_line[i][t]=cnt_row[j][t]=cnt_3[i/3][j/3][t]=1;
            if(k==sz-1)    return true;
            if(k<sz-1){
                int x=blank[k+1].first,y=blank[k+1].second;
                if(dfs(x,y,k+1))
                    return true;
                //恢复现场,应该是恢复当前i,j而不是x,y因为x,y在自己失败之后就会恢复
                matrix[i][j]=cnt_line[i][t]=cnt_row[j][t]=cnt_3[i/3][j/3][t]=0;
            }
        }
    }
    return false;

}
int main(){
    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            int a;
            cin>>a;
            matrix[i][j]=a;
            if(a){
                cnt_line[i][a]=1;
                cnt_row[j][a]=1;
                cnt_3[i/3][j/3][a]=1;
            }
            else
                blank.push_back({i,j});
        }
    }
    if((sz=blank.size())){
        int x=blank[0].first,y=blank[0].second;
        dfs(x,y,0);
    }
    for(int i=0;i<9;i++){
        cout<<matrix[i][0];
        for(int j=1;j<9;j++)
            cout<<" "<<matrix[i][j];
        cout<<"\n";
    }

}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务