【程序设计与算法】熄灯问题

来源:互联网 发布:linux 解压war 编辑:程序博客网 时间:2024/06/06 05:50
问题讲解: 
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

这里写图片描述


代码如下:

#include <iostream>#include<memory>#include<cstring>#include<string>using namespace std;char oriLinghts[5];//存放输入原始的灯char lights[5];//变化灯的矩阵char result[5];//最终结果矩阵int GetBit(char c,int i)//取c的第i位的情况{    return (c >> i) & 1;}void SetBit(char & c,int i, int v)//设置字符c的第i位改为v{    if(v){//v是1        c |= ( 1 << i);//c的第i位变成1    }    else {        c &= ~(1 << i);//    }}void FlipBit(char &c , int i)//把c的第i位翻转{    c ^=( 1 << i);//异或运算}void OutputResult(int t,char result[]){    cout << "PUZZLE #" << t << endl;    for(int i = 0;i < 5 ; ++i){            for(int j = 0; j < 6 ; ++j){                    cout << GetBit(result[i],j);                    if(j < 5)                        cout << " ";                        }        cout << endl;        }}int main(){    int T;    cin >> T;    for(int t = 1 ; t<= T ; ++t){        for(int i = 0 ;i < 5;++i)            for(int j = 0;j < 6; ++j){                    int s;            cin >> s;            SetBit(oriLinghts[i],j,s);            }       for(int n = 0;n < 64 ; ++n){        int switchs = n;        memcpy(lights,oriLinghts,sizeof(oriLinghts));//复制orilights到lights        for(int i = 0;i < 5;++i){            result[i] = switchs;            for(int j = 0;j< 6; j++){                if(GetBit(switchs,j)){                    if (j > 0)                        FlipBit(lights[i],j-1);                    FlipBit(lights[i],j);                    if ( j < 5)                        FlipBit(lights[i],j+1);                }            }            if(i < 4 )                lights[i + 1] ^= switchs;            switchs = lights[i];                }            if(lights[4] == 0){                OutputResult(t,result);                break;            }        }    }    return 0;}




原创粉丝点击