数独
作者:互联网
数独填空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