zoukankan      html  css  js  c++  java
  • Sudoku

    搜索......每一个都去试一遍.....A了,代码:

    #include<iostream>
    #include<cstring>
    using namespace std;
    int a[1100][1100];
    int ans1[1100][1100],ans2[1100][1100],ans3[1100][1100];
    int n;
    bool djy=0;
    void dfs(int x,int y) {
        if(djy==1) return ;//为了不OLE....
        if(a[x][y]!=0) { //有数
            if(x==9&&y==9) { //输出
                for(int i=1; i<=9; i++) {
                    for(int j=1; j<=9; j++) {
                        cout<<a[i][j];
                    }
                    cout<<endl;
                }
                djy=1;
                cout<<endl;
                return ;
            }
            if(y==9) { //行数加加
                dfs(x+1,1);
            } else { //列数加加
                dfs(x,y+1);
            }
        }
        if(a[x][y]==0) { //没数
            for(int i=1; i<=9; i++) {
                if(ans1[x][i]==0&&ans2[y][i]==0&&ans3[(x-1)/3*3+(y-1)/3+1][i]==0) { //判断 
                    a[x][y]=i;
                    ans1[x][i]=1;
                    ans2[y][i]=1;
                    ans3[(x-1)/3*3+(y-1)/3+1][i]=1;
                    if(x==9&&y==9) {
                        for(int i=1; i<=9; i++) {
                            for(int j=1; j<=9; j++) {
                                cout<<a[i][j];
                            }
                            cout<<endl;
                        }
                        djy=1;
                        cout<<endl;
                        return ;
                    }
                    if(y==9) dfs(x+1,1);//和上面的一样 
                    else dfs(x,y+1);
                    a[x][y]=0;
                    ans1[x][i]=0;
                    ans2[y][i]=0;
                    ans3[(x-1)/3*3+(y-1)/3+1][i]=0;//回溯 
                }
            }
        }
    }
    int main() {
        cin>>n;
        for(int k=1; k<=n; k++) {
            memset(ans1,0,sizeof(ans1));//赋初值
            memset(ans2,0,sizeof(ans2));
            memset(ans3,0,sizeof(ans3));
            for(int i=1; i<=9; i++) {
                for(int j=1; j<=9; j++) {
                    char ch;
                    cin>>ch;
                    a[i][j]=ch-'0';
                    if(a[i][j]>0) {
                        ans1[i][a[i][j]]=1;//标记有数
                        ans2[j][a[i][j]]=1;//同上
                        ans3[(i-1)/3*3+(j-1)/3+1][a[i][j]]=1;//宫格公式.....
                    }
                }
            }
            djy=0;
            dfs(1,1);
        }
    }

    A了QwQ(不小心点了格式化)

  • 相关阅读:
    学习记录18
    学习记录17
    学习记录16
    小白的心酸连网历程
    学习记录15
    学习记录14
    学习记录13
    学习记录12
    学习记录10
    语法糖
  • 原文地址:https://www.cnblogs.com/dai-jia-ye/p/9447828.html
Copyright © 2011-2022 走看看