C/C++教程

c++ 北大oj1222 熄灯问题

本文主要是介绍c++ 北大oj1222 熄灯问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

#include <bitset> 
#include <memory>
#include <cstring>
#include <iostream>
using namespace std;
bitset<6> source[5], result[5], lights[5];
bitset<6> line; //000000~111111 0-2^6-1
void input_source()       /*原始数据输入函数*/
{
    int x;
    for(int i=0; i<5; i++)
        for(int j=0; j<6; j++)
        {
            cin >> x;
            source[i][j]=x;    
        }
                
}

void output_result()        /*输出结果函数*/
{
    for(int i=0; i<5; i++)
    {
        for(int j=0; j<6; j++)
            cout << result[i][j] << " ";
        cout << endl;    
    }    
}

int main()      /*主函数*/
{
    int t=0;
    cin >> t;         /*输入要输入的个数*/

    for(int i=0; i<t; i++)
    {
        input_source(); 
        for(int n=0; n<64; n++)
       {
        memcpy(lights,source,sizeof(source));         /*把原始数据赋给新数组方便操作*/
        line = n;
        for(int k=0; k<5; k++)
        {
            result[k] = line;                        /*从上往下,保证下一行使上一行全部为0,即熄灯状态*/
            for(int j=0; j<6; j++)
            {
                if (line.test(j))         /*判断是否为0*/
                {
                    lights[k][j].flip();              
                    lights[k+1][j].flip();
                    if(j>0)    lights[k][j-1].flip();        /*不是最左边的话左边也要翻转*/
                    if(j<5) lights[k][j+1].flip();        /*不是最右边的话右边也要翻转*/
                }
            }
            line = lights[k];     /*把使上一行为0的下一行赋给line,重复上述操作*/
        }
        if(lights[4].none()) 
        {
            cout << "PUZZLE #" << i+1 <<endl;     
            output_result();     /*输出最终结果*/
            break;
        }     
    }
        
    }
    
}

这篇关于c++ 北大oj1222 熄灯问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!