思路
- 思路:dfs
- 预处理出来每个3*3小方格已经填了什么数字,每一行已经填了什么数字,每一列已经填了什么数字,枚举一下矩阵为0的格子,只要有一个情况成功即可。
代码
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int a[10][10];
int cvis[10][10];
int rvis[10][10];
int vis[4][4][10];
bool bfs(int col,int row){
if(col==10&&row==1){
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
cout << a[i][j];
}
cout << "\n";
}
return true;
}
if(a[col][row]){
if(row==9)return bfs(col+1,1);
else{
return bfs(col,row+1);
}
}
for(int i=1;i<=9;i++){
if(vis[(col+2)/3][(row+2)/3][i])continue;
if(cvis[col][i])continue;
if(rvis[row][i])continue;
vis[(col+2)/3][(row+2)/3][i]=1;
cvis[col][i]=1;
rvis[row][i]=1;
a[col][row]=i;
if(row==9){
if(bfs(col+1,1))return true;
}
else{
if(bfs(col,row+1))return true;
}
a[col][row]=0;
vis[(col+2)/3][(row+2)/3][i]=0;
cvis[col][i]=0;
rvis[row][i]=0;
}
return false;
}
int main(){
int T;
cin >> T;
while(T--){
memset(vis,0,sizeof vis);
memset(cvis,0,sizeof cvis);
memset(rvis,0,sizeof rvis);
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
char c;
cin >> c;
a[i][j]=c-'0';
cvis[i][a[i][j]]=1;
rvis[j][a[i][j]]=1;
vis[(i+2)/3][(j+2)/3][a[i][j]]=1;
}
}
bfs(1,1);
}
}