poj 1222 & zoj 1354 EXTENDED LIGHTS OUT (枚举)

http://poj.org/problem?id=1222

和poj 1753类似,1753是求全0或全1的步数,这题是求全0的解决方案。

当时是拿1753的代码改的,枚举步数,最多30步,这样的话状态总量就是2^30。。。

枚举第一行状态,共2^6,第一行确定了便可确定其余行,最后看末行是否全为0即可。

code:

#include<cstdio>
#include<cstring>
int map[ 5][ 6], ans[ 5][ 6] ;
int tur[ 5][ 2] = { 00010, - 110, - 10} ;
int flag ;
void Tur( int x,  int y){
     for( int i= 0; i< 5; i++){
         int tx = x + tur[i][ 0] ;
         int ty = y + tur[i][ 1] ;
         if(tx>= 0&&ty>= 0&&tx< 5&&ty< 6)
            map[tx][ty] ^=  1 ;
    }
}
void work(){         // 根据第一行的状态确定其余ans
     for( int i= 1; i< 5; i++)
         for( int j= 0; j< 6; j++)
             if(map[i- 1][j]){
                Tur(i, j) ;
                ans[i][j] =  1 ;
            }
}
void back(){
     for( int i= 1; i< 5; i++)
         for( int j= 0; j< 6; j++)
             if(ans[i][j]){
                Tur(i, j) ;
                ans[i][j] =  0 ;
            }
}
void test(){
    flag =  1 ;
     for( int i= 0; i< 6; i++)
         if(map[ 4][i]== 1)    flag =  0 ;
}
void print(){
     int i, j ;
     for(i= 0; i< 5; i++){
         for(j= 0; j< 5; j++)
            printf( " %d  ", ans[i][j]) ;
        printf( " %d\n ", ans[i][j]) ;
    }
}
void dfs( int y){         // 枚举第一行64种状态
     if(flag)     return ;
     if(y== 6){
        work() ;
        test() ;
         if(flag)    print() ;
         else        back() ;
    }
     else{
        Tur( 0, y) ;
        ans[ 0][y] =  1 ;
        dfs(y+ 1) ;
        Tur( 0, y) ;
        ans[ 0][y] =  0 ;
        dfs(y+ 1) ;
    }
}
int main(){
     int t= 0, i, j, n ;
    scanf( " %d ", &n) ;
     while(n--){
        memset(ans,  0sizeof(ans)) ;
        flag =  0 ;
         for(i= 0; i< 5; i++)
             for(j= 0; j< 6; j++)
                scanf( " %d ", &map[i][j]) ;
        printf( " PUZZLE #%d\n ", ++t) ;
        dfs( 0) ;
    }
     return  0 ;} 

你可能感兴趣的:(extend)