poj 2676 Suduku (dfs)

单纯的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< 3return  1 ;
     else  if(x< 6return  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+ 10) ;
         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+ 10) ;
                 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,  falsesizeof(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,  falsesizeof(c)) ;
        memset(r,  falsesizeof(r)) ;
        memset(s,  falsesizeof(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( 00) ;
         for(i= 0; i< 9; i++){
             for(j= 0; j< 9; j++)
                printf( " %d ", data[i][j]) ;
            printf( " \n ") ;
        }
    }
     return  0 ;

转载于:https://www.cnblogs.com/xiaolongchase/archive/2012/02/16/2353465.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值