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 ;} 
posted on 2012-04-13 11:46  追逐.  阅读(304)  评论(0编辑  收藏  举报