标签:
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