C++基礎算法學習——熄燈問題

有一個由按鈕組成的矩陣, 其中每行有6個按鈕, 共5行
– 每個按鈕的位置上有一盞燈
– 當按下一個按鈕後, 該按鈕以及周圍位置(上邊, 下邊,
左邊, 右邊)的燈都會改變狀態
26熄燈問題 POJ1222
– 如果燈原來是點亮的, 就會被熄滅
– 如果燈原來是熄滅的, 則會被點亮
在矩陣角上的按鈕改變3盞燈的狀態
在矩陣邊上的按鈕改變4盞燈的狀態
其他的按鈕改變5盞燈的狀態
27熄燈問題 POJ1222
與一盞燈毗鄰的多個按鈕被按下時,一個操作會抵消另一次操
作的結果
給定矩陣中每盞燈的初始狀態,求一種按按鈕方案,使得所有
的燈都熄滅熄燈問題 POJ1222
輸入:
– 第一行是一個正整數N, 表示需要解決的案例數
– 每個案例由5行組成, 每一行包括6個數字
– 這些數字以空格隔開, 可以是0或1
– 0 表示燈的初始狀態是熄滅的
– 1 表示燈的初始狀態是點亮的
29熄燈問題 POJ1222
輸出:
– 對每個案例, 首先輸出一行,
輸出字符串 “PUZZLE #m”, 其中m是該案例的序號
– 接着按照該案例的輸入格式輸出5行
1 表示需要把對應的按鈕按下
0 表示不需要按對應的按鈕
每個數字以一個空格隔開

代碼如下:

複製代碼

#include <iostream>#include<string.h>using namespace std;char Oright[5];char Light[5];char Result[5];void SetChar(char &  t,int j,int s);void OutPut(char * t);int GetChar(char  t,int j);void Flip(char & s,int i);int main()
{    int switches;    for(int i=0;i<5;i++)//一個位一個位的存儲。    {        for(int j=0;j<6;j++)
        {            int s;
            cin>>s;
            SetChar(Oright[i],j,s);
        }
    }    for(int i=0;i<64;i++)
    {
        memcpy(Light,Oright,sizeof(Oright));
        switches=i;        for(int j=0;j<5;j++)//對於i的值,每行開始測試        {
            Result[j]=switches;//Result存儲的是開關的按壓方案。
            for(int k=0;k<6;k++)//每列開始測試            {                if(GetChar(switches,k))
                {                    if(k>0)
                        Flip(Light[j],k-1);//左邊開始變化                    Flip(Light[j],k);                    if(k<5)
                        Flip(Light[j],k+1);//右邊開始變化                }
            }            if(j<4)
                Light[j+1]^=switches;
            switches=Light[j];
        }        if(Light[4]==0)
        {
            cout<<"結束!"<<endl;
            OutPut(Result);            break;
        }
    }    return 0;
}void Flip(char & s,int i)
{
    s=s^(1<<i);
}int GetChar(char  t,int j)
{    return (t>>j)&1;
}void SetChar(char & t,int j,int s)
{    if(s==1)
        t=t|(1<<j);    else
         t=t&(~(1<<j));
}void OutPut(char * t)
{    for(int i=0;i<5;i++)
    {        for(int j=0;j<6;j++)
        {
            cout<<GetChar(t[i],j);
            cout<<"   ";
        }
        cout<<endl;
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章