zoukankan      html  css  js  c++  java
  • 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 ;} 
  • 相关阅读:
    LLVM生成中间码以及汇编代码
    汇编知识
    delphi 连接 c++ builder 32 生成obj文件
    新知识
    Java的Guid生成
    sql:一对多【转载】
    关于使用js完成购物车计算时的一些问题。
    mysql多条件查询,当某个条件为空时忽略该条件,所有条件为空时查询全部
    转载:获取用户的真实ip地址
    ssh 报错hibernate java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to XXX
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/2445517.html
Copyright © 2011-2022 走看看