其他分享
首页 > 其他分享> > 数独

数独

作者:互联网

数独填空1

传送门

#include <iostream>
#include <cstdio>
#include <cstring>
#define iofuck std::ios::sync_with_stdio(false),cin.tie(0)
using namespace std;
int sudoku[10][10];
int vis1[10][10];//vis1[i][x]第i行中数字x是否出现过
int vis2[10][10];//vis2[j][x]第j列中数字x是否出现过
int vis[10][10];//vis[k][x]第k个3*3子格中数字x是否出现过
int flag=0;//对于这种情况多的,用flag减少时间复杂度
void print(){
    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++){
            printf("%d",sudoku[i][j]);
        }
        putchar('\n');
    }
}

void dfs(int x,int y){
    if(flag)return;
    if(x==9){
        flag=1;
        print();
        return;
    }else{
        if(sudoku[x][y]){//该位置数字不是0
            if(y<8)dfs(x,y+1);//最后一行,横着搜
            else dfs(x+1,0);//如果已经到了最后一列.继续搜索下一行的第一列
        }else{//该位置数字是0
            for(int i=1;i<=9;i++){
                if(!vis1[x][i]&&!vis2[y][i]&&!vis[x/3*3+y/3][i]){
                    sudoku[x][y]=i;
                    vis1[x][i]=vis2[y][i]=vis[x/3*3+y/3][i]=1;
                    if(y<8)dfs(x,y+1);//最后一行,横着搜
                    else dfs(x+1,0);//如果已经到了最后一列.继续搜索下一行的第一列
                    sudoku[x][y]=0;//回溯
                    vis1[x][i]=vis2[y][i]=vis[x/3*3+y/3][i]=0;
                }
            }
        }
    }

}
int main(){
    iofuck;
    int t;
    cin>>t;
    while(t--){
        flag=0;
        memset(sudoku,0,sizeof(sudoku));
        memset(vis,0,sizeof(vis));
        memset(vis1,0,sizeof(vis1));
        memset(vis2,0,sizeof(vis2));
        for(int i=0;i<9;i++){
            for(int j=0;j<9;j++){
                scanf("%1d",&sudoku[i][j]);
                if(sudoku[i][j]!=0){
                    int v=sudoku[i][j];
                    vis1[i][v]=1;//
                    vis2[j][v]=1;//
                    vis[i/3*3+j/3][v]=1;//
                }
            }
        }
        dfs(0,0);
    }
    return 0;
}

舞蹈链求数独

标签:vis2,10,vis1,int,memset,vis,数独
来源: https://www.cnblogs.com/Emcikem/p/11516866.html