HDU 1426数独キラー

HDU 1426数独キラー(DFS)

トピックリンク:http://acm.hdu.edu.cn/showproblem.php?pid=1426
ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明
問題解決のアイデア:メイングリッドを越えてまで、フレームのダウンによって、最初のフレームから始まるにより横断DFS(トピックを保証ので、ユニークなソリューション)、それぞれの出会いがありますか?値に沿ったもので、現在の状況かどうかを確認するために、記入してみてください上の1-9は、再帰的に、グリッドを超えて発見された、結果は(サンプル2つのグループは空白行を持っているかもしれません)入力にライン上の出力、注意を払うしていると言います
コードは次のとおりです。

#include<bits/stdc++.h>
using namespace std;
int sudoku[15][15];
inline bool check(int x,int y,int v){
    for(int i=1;i<=9;i++){
        if(sudoku[x][i]==v||sudoku[i][y]==v)return false;
    }
    int m,n;
    if(x>=1&&x<=3){
        if(y>=1&&y<=3){
            m=1,n=1;
        }else if(y>=4&&y<=6){
            m=1,n=4;
        }else{
            m=1,n=7;
        }
    }else if(x>=4&&x<=6){
        if(y>=1&&y<=3){
            m=4,n=1;
        }else if(y>=4&&y<=6){
            m=4,n=4;
        }else{
            m=4,n=7;
        }
    }else{
        if(y>=1&&y<=3){
            m=7,n=1;
        }else if(y>=4&&y<=6){
            m=7,n=4;
        }else{
            m=7,n=7;
        }
    }
    for(int i=m;i<=m+2;i++){
        for(int j=n;j<=n+2;j++){
            if(sudoku[i][j]==v)return false;
        }
    }
    return true;
}
bool flag;
inline void dfs(int x,int y){
    if(flag)return;
    if(x==10){
        flag=true;
        for(int i=1;i<=9;i++){
            for(int j=1;j<=9;j++){
                if(j!=1)cout<<" ";
                cout<<sudoku[i][j];
            }
            cout<<endl;
        }
        return;
    }
    if(y==10){
        dfs(x+1,1);
        return;
    }
    if(sudoku[x][y]!=0){
        dfs(x,y+1);
        return;
    }
    for(int i=1;i<=9;i++){
        if(check(x,y,i)){
            sudoku[x][y]=i;
            dfs(x,y+1);
            if(flag)return;
            sudoku[x][y]=0;
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    int ans=0;
    char c;
    while(cin>>c){//用cin输入能避免很多麻烦的处理
        for(int i=1;i<=9;i++){
            for(int j=1;j<=9;j++){
                if(i!=1||j!=1)cin>>c;
                if(c=='?')sudoku[i][j]=0;
                else sudoku[i][j]=c-'0';
            }
        }
        if(ans!=0)cout<<endl;
        ans++;
        flag=false;
        dfs(1,1);
    }
    return 0;
}
公開された35元の記事 ウォンの賞賛3 ビュー886

おすすめ

転載: blog.csdn.net/weixin_43823753/article/details/104638331