单纯的dfs,用三个数组记录行、列以及3×3方格的情况。
只是一开始不知道为什么没办法结束程序的运行,提交两次TLE,感觉应该是getchar()的问题。
code:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std ;
bool c[10][10] ;
bool r[10][10] ;
bool s[4][4][10] ;
bool vis[10][10] ;
char str[10] ;
int data[10][10] ;
bool flag ;
int cur(int x){
if(x<3) return 1 ;
else if(x<6) return 2 ;
else return 3 ;
}
void dfs(int row, int col){
if(row==9){
flag = true ;
return ;
}
if(vis[row][col]){
if(col==8) dfs(row+1, 0) ;
else dfs(row, col+1) ;
}
else{
vis[row][col] = true ;
for(int i=1; i<=9; i++){
if(flag) break ;
if(!r[row][i]&&!c[col][i]&&!s[cur(row)][cur(col)][i]){
data[row][col] = i ;
r[row][i] = true ;
c[col][i] = true ;
s[cur(row)][cur(col)][i] = true ;
if(col==8)
dfs(row+1, 0) ;
else
dfs(row, col+1) ;
r[row][i] = false ;
c[col][i] = false ;
s[cur(row)][cur(col)][i] = false ;
}
}
vis[row][col] = false ;
}
}
int main(){
int t, i, j ;
scanf("%d", &t) ;
while(t--){
memset(vis, false, sizeof(vis)) ;
for(i=0; i<9; i++){
getchar() ;
scanf("%s", str) ;
for(j=0; j<9; j++){
data[i][j] = str[j] - '0' ;
if(data[i][j]>0) vis[i][j] = true ;
}
}
memset(c, false, sizeof(c)) ;
memset(r, false, sizeof(r)) ;
memset(s, false, sizeof(s)) ;
for(i=0; i<9; i++)
for(j=0; j<9; j++){
if(data[i][j]>0){
r[i][data[i][j]] = true ;
c[j][data[i][j]] = true ;
s[cur(i)][cur(j)][data[i][j]] = true ;
}
}
flag = false ;
dfs(0, 0) ;
for(i=0; i<9; i++){
for(j=0; j<9; j++)
printf("%d", data[i][j]) ;
printf("\n") ;
}
}
return 0 ;
#include<iostream>
#include<cstring>
using namespace std ;
bool c[10][10] ;
bool r[10][10] ;
bool s[4][4][10] ;
bool vis[10][10] ;
char str[10] ;
int data[10][10] ;
bool flag ;
int cur(int x){
if(x<3) return 1 ;
else if(x<6) return 2 ;
else return 3 ;
}
void dfs(int row, int col){
if(row==9){
flag = true ;
return ;
}
if(vis[row][col]){
if(col==8) dfs(row+1, 0) ;
else dfs(row, col+1) ;
}
else{
vis[row][col] = true ;
for(int i=1; i<=9; i++){
if(flag) break ;
if(!r[row][i]&&!c[col][i]&&!s[cur(row)][cur(col)][i]){
data[row][col] = i ;
r[row][i] = true ;
c[col][i] = true ;
s[cur(row)][cur(col)][i] = true ;
if(col==8)
dfs(row+1, 0) ;
else
dfs(row, col+1) ;
r[row][i] = false ;
c[col][i] = false ;
s[cur(row)][cur(col)][i] = false ;
}
}
vis[row][col] = false ;
}
}
int main(){
int t, i, j ;
scanf("%d", &t) ;
while(t--){
memset(vis, false, sizeof(vis)) ;
for(i=0; i<9; i++){
getchar() ;
scanf("%s", str) ;
for(j=0; j<9; j++){
data[i][j] = str[j] - '0' ;
if(data[i][j]>0) vis[i][j] = true ;
}
}
memset(c, false, sizeof(c)) ;
memset(r, false, sizeof(r)) ;
memset(s, false, sizeof(s)) ;
for(i=0; i<9; i++)
for(j=0; j<9; j++){
if(data[i][j]>0){
r[i][data[i][j]] = true ;
c[j][data[i][j]] = true ;
s[cur(i)][cur(j)][data[i][j]] = true ;
}
}
flag = false ;
dfs(0, 0) ;
for(i=0; i<9; i++){
for(j=0; j<9; j++)
printf("%d", data[i][j]) ;
printf("\n") ;
}
}
return 0 ;
}