标签:
Description

Input
Output
Sample Input
1 103000509 002109400 000704000 300502006 060000050 700803004 000401000 009205800 804000107
Sample Output
143628579 572139468 986754231 391542786 468917352 725863914 237481695 619275843 854396127
找出每一行,每一列,每一个小方格中可以填的数,进行dfs搜索结果
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
int l[10][10] , r[10][10] , c[10][10] ;
struct node
{
int x , y ;
} p[100] ;
int num ;
char str[12][12] ;
int dfs(int k)
{
if( k == num ) return 1 ;
int x = p[k].x , y = p[k].y ;
int i ;
for(i = 1 ; i <= 9 ; i++)
{
if( !r[x][i] && !l[y][i] && !c[x/3*3+y/3][i] )
{
r[x][i] = l[y][i] = 1 ;
c[x/3*3+y/3][i] = 1 ;
str[x][y] = i + '0' ;
if( dfs(k+1) )
return 1 ;
str[x][y] = '0' ;
r[x][i] = l[y][i] = 0 ;
c[x/3*3+y/3][i] = 0 ;
}
}
return 0 ;
}
int main()
{
int t , i , j ;
scanf("%d", &t) ;
while( t-- )
{
num = 0 ;
memset(l,0,sizeof(l)) ;
memset(r,0,sizeof(r)) ;
memset(c,0,sizeof(c)) ;
for(i = 0 ; i < 9 ; i++)
{
scanf("%s", str[i]) ;
for(j = 0 ; j < 9 ; j++)
{
if( str[i][j] != '0' )
{
r[i][ str[i][j] - '0' ] = 1 ;
l[j][ str[i][j] - '0' ] = 1 ;
c[ i/3*3+j/3 ][ str[i][j] - '0' ] = 1 ;
}
else
{
p[num].x = i ;
p[num++].y = j ;
}
}
}
dfs(0) ;
for(i = 0 ; i < 10 ; i++)
printf("%s\n", str[i]) ;
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/winddreams/article/details/42979929