Logo 铜龟的博客

博客

求助!

2023-05-14 15:09:02 By 铜龟

请问我的sudoku有什么可以优化的???在本第一个稍微复杂的用例挂20分钟都出不来

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
bool over2=false;
int g[9][9][2]={
    {{0,0},{0,1},{0,2},{1,0},{1,1},{1,2},{2,0},{2,1},{2,2}},
    {{0+3,0},{0+3,1},{0+3,2},{1+3,0},{1+3,1},{1+3,2},{2+3,0},{2+3,1},{2+3,2}},   
    {{0+6,0},{0+6,1},{0+6,2},{1+6,0},{1+6,1},{1+6,2},{2+6,0},{2+6,1},{2+6,2}},
    {{0,0+3},{0,1+3},{0,2+3},{1,0+3},{1,1+3},{1,2+3},{2,0+3},{2,1+3},{2,2+3}},
    {{0,0+6},{0,1+6},{0,2+6},{1,0+6},{1,1+6},{1,2+6},{2,0+6},{2,1+6},{2,2+6}},
    {{0+6,0+6},{0+6,1+6},{0+6,2+6},{1+6,0+6},{1+6,1+6},{1+6,2+6},{2+6,0+6},{2+6,1+6},{2+6,2+6}},
    {{0+3,0+3},{0+3,1+3},{0+3,2+3},{1+3,0+3},{1+3,1+3},{1+3,2+3},{2+3,0+3},{2+3,1+3},{2+3,2+3}},
    {{3,6},{3,7},{3,8},{4,6},{4,7},{4,8},{5,6},{5,7},{5,8}},
    {{6,3},{6,4},{6,5},{7,3},{7,4},{7,5},{8,3},{8,4},{8,5}}
};
bool over(int c[9][9]){
    int d[10];
    for(int i = 0;i < 9;i++){
        memset(d,0,sizeof(d));
        for(int j = 0;j < 9;j++){
            d[c[i][j]]+=1;
        }
        for(int i = 1;i <= 9;i++){
            if(d[i]!=1) return false;
        }
    }//横向
    for(int i = 0;i < 9;i++){
        memset(d,0,sizeof(d));
        for(int j = 0;j < 9;j++){
            d[c[j][i]]+=1;
        }
        for(int i = 1;i <= 9;i++){
            if(d[i]!=1) return false;
        }
    }//竖向
    for(int i = 0;i < 9;i++){
        memset(d,0,sizeof(d));
        for(int j = 0;j < 9;j++){
            d[c[g[i][j][0]][g[i][j][1]]]+=1;
        }
        for(int i = 1;i <= 9;i++){
            if(d[i]!=1) return false;
        }
    }//宫格
    return true;
}
bool em(int c[9][9]){
    for(int i = 0;i < 9;i++){
        for(int j = 0;j <9;j++){
            if(c[i][j]==0) return false;
        }
    }
    return true;
}
void dfs(int gz[9][9]){
    int cp[9][9];
    if(over2) return;
    if(over(gz)){
        for(int i = 0;i < 9;i++){
            for(int j = 0;j < 9;j++){
                cout<<gz[i][j]<<" ";
            }
            cout<<endl;
        }
        over2=true;
    }else if(!em(gz)){
        for(int i = 0;i < 9;i++){
            for(int j = 0;j < 9;j++){
                if(gz[i][j]==0){
                    for(int m = 1;m <=9;m++){
                        for(int k = 0;k < 9;k++){
                            for(int l=0;l<9;l++){
                                cp[k][l]=gz[k][l];
                            }
                        }
                        cp[i][j]=m;
                        dfs(cp);
                    }
                }
            }
        }
    }
}
int main(){
    int b[9][9];
    for(int i = 0;i < 9;i++){
        for(int j = 0;j < 9;j++){
            cin>>b[i][j];
        }
    }
    cout<<"Anser is:"<<endl;
    dfs(b);
    return 0;
}

0 9 2 4 8 1 7 6 3 4 1 3 7 6 2 9 8 5 8 6 7 3 5 9 4 1 2 6 2 4 1 9 5 3 7 8 7 5 9 8 4 3 1 2 6 1 3 8 6 2 7 5 9 4 2 7 1 5 3 8 6 4 9 3 8 6 9 1 4 2 5 7 0 4 5 2 7 6 8 3 1

这个用例可以过

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。