poj(1222)——EXTENDED LIGHTS OUT

题意:

当前有一个6*5的矩形,然后输入中给出每个灯的状态,1表示当前灯是亮的,0表示灯是灭的。然后让你给出一种能把所有的灯都熄灭的方案,并输出之。其中输出的矩阵中1表示 按这个位置的灯,0表示不按这个位置的灯。

思路:

数据范围也不是很大。。直接暴力就好了。。

我是对第一行进行枚举,然后只要把第1行搞定了就可以搞第二行,第三行,,,依次类推。

我用一个num[i][j]表示当前格子的状态是开着的还是关着的。press数组记录这个格子是否有被按过(1表示按了,0表示没有按),puz数组是用来存灯的最初状态(即为亮还是没亮)。

然后要求当前格子的状态,它只与当前格子是否按了press[i][j],与最初的灯是否亮的puz[i][j],与上一行的press[i-1][j],与前一列的press[i][j-1],后一列press[i][j+1]有关,所以num[i][j]就等于以上和再mod2就可以求出当前格子的状态了。

p.s:为了方便,我们把5*6的矩阵扩大为6*8的矩阵,因为为了当求第一行和第一列的时候方便一点嘛~~


#include<cstdio>
#include<cstring>
#include<map>
#include<set>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<iostream>
#include<time.h>
using namespace std;
typedef __int64 ll;
typedef unsigned __int64 ULL;
#define pi acos(-1.0)
#define Ex exp(1.0)
#define maxn 11
int press[maxn][maxn],puz[maxn][maxn];
int num[maxn][maxn];
int main(){
    int T,gg=1;
    scanf("%d",&T);
    while(T--){
        memset(puz,0,sizeof(puz));
        memset(press,0,sizeof(press));
        memset(num,0,sizeof(num));
        for(int i=1;i<=5;i++){
            for(int j=1;j<=6;j++){
                scanf("%d",&puz[i][j]);
            }
        }
        int ff=0;
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                for(int k=0;k<2;k++){
                    for(int l=0;l<2;l++){
                        for(int m=0;m<2;m++){
                            for(int n=0;n<2;n++){
                                memset(press,0,sizeof(press));
                                memset(num,0,sizeof(num));
                                press[1][1]=i; press[1][2]=j;
                                press[1][3]=k; press[1][4]=l;
                                press[1][5]=m; press[1][6]=n;
                                for(int hang=1;hang<=5;hang++){
                                    for(int lie=1;lie<=6;lie++){
                                        if(hang==1) num[hang][lie]=(puz[hang][lie]+press[hang][lie]+press[hang-1][lie]+press[hang][lie-1]+press[hang][lie+1])%2;
                                        else if(num[hang-1][lie]==1){
                                            press[hang][lie]=1;
                                        }
                                        else if(num[hang-1][lie]==0) press[hang][lie]=0;
                                    }
                                    if(hang==1) continue;
                                    for(int lie=1;lie<=6;lie++){
                                        num[hang][lie]=(puz[hang][lie]+press[hang][lie]+press[hang-1][lie]+press[hang][lie-1]+press[hang][lie+1])%2;
                                    }
                                }
                                ff=0;
                                for(int i=1;i<=6;i++){
                                    if(num[5][i]){
                                         ff=1;
                                         break;
                                    }
                                }
                                if(!ff) break;
                            }
                            if(!ff) break;
                        }
                        if(!ff) break;
                    }
                    if(!ff) break;
                }
                if(!ff) break;
            }
            if(!ff) break;
        }
        printf("PUZZLE #%d\n",gg++);
        for(int i=1;i<=5;i++){
            for(int j=1;j<=6;j++){
                if(j!=6) printf("%d ",press[i][j]);
                else printf("%d\n",press[i][j]);
            }
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值