第一周(枚举)

1.

2811:熄灯问题(bailian)

#include<cstdio>
#include<iostream>//cin cout
#include<string.h>//<string>ÊDz»¶ÔµÄ£¬Ó¦¸Ã¼Ó.h
#include<cstdlib>
#include<cmath>
#include<vector>//¶þάÊý×é
#include<algorithm>//
#include<set>//¼¯ºÏ
#include<map>
#include<stack>
#include<queue>
#include<iomanip>
using namespace std;
const int maxn=1010;
const int inf=0x3fffffff;

int origin[5],result[5],lights[5];

void setBit(int &n,int d,int k){
                if(k){
                             n|=(k<<d);
                             }
                else{
                             n&=~(1<<d);
                             }                                           
                }

int getBit(int n,int k){
             return (n>>k)&1;
             }
                
void flip(int &n,int k){
              n=n^(1<<k);
              }
                
void print(int result[]){
               for(int i=0;i<5;i++){
                       for(int j=0;j<6;j++){
                               int k=getBit(result[i],j);
                               printf("%d",k);
                               if(j<5)printf(" ");
                               }
                       if(i<4)printf("\n");
                       }
               }                
                              
int main()  {  
            memset(origin,0,sizeof(origin));
            for(int j=0;j<5;j++){
                    for(int k=0;k<6;k++){
                            int number;
                            cin>>number;
                            setBit(origin[j],k,number);                            
                            }
                    }
                    
            for(int j=0;j<64;j++){
                    memcpy(lights,origin,sizeof(origin));
                    int switches=j;
                    for(int m=0;m<5;m++){
                            result[m]=switches;
                            for(int k=0;k<6;k++){
                            int binumber=getBit(switches,k);
                                if(binumber){
                                             flip(lights[m],k);
                                             if(k<5){
                                                     flip(lights[m],k+1);
                                                     }
                                             if(k>0){
                                                     flip(lights[m],k-1);
                                                     }
                                             }
                                
                                         }
                            if(m<4)lights[m+1]=lights[m+1]^switches;  
                            switches=lights[m];                 
                            }
                    if(lights[4]==0){
                                     print(result);
                                     break;
                                     }
                    }

    system("pause");
    return 0;        
}  

注意问题:1.与1异或-->求反;2.与0异或-->值不变。

         



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值