2.2.4 PARTY LAMPS 派對燈

2018-06-19 14:03 更新

http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=2328
題目大意:(如題)
輸入輸出:(如題)
解題思路:
1.因為每個按鈕按2次和沒按效果是一樣的。所以每個按鈕或者按或者不按,一共有2^4=16中狀態(tài)。
2.然后因為這個電燈系統(tǒng)有個性質(zhì),每6個一循環(huán),所以把這4個按鈕的16種狀態(tài)對應(yīng)的前6個燈的狀態(tài)枚舉出來。然后分析,發(fā)現(xiàn)一下規(guī)律:
-按1和按2相當(dāng)于按3;
-按2和按3相當(dāng)于按1;
-按1和按3相當(dāng)于按2;
-按1按2和按3相當(dāng)于不按;
-相差3的倍數(shù)也可以相互轉(zhuǎn)換;
消重之后得到8種按法:不按,按1,按2,按3,按4,按1按4,按2按4,按3按4。
相對應(yīng)的最少按的次數(shù)為:0,1,1,1,1,2,2,2。
3.參照了NOCOW-USACO上的一個比較邪惡的方法-常量表法,把前6個燈的狀態(tài)保存在light數(shù)組里面,然后用一個minnum數(shù)組存儲相應(yīng)狀態(tài)的按的次數(shù)。如下:

int light[9][7]={
    0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,//按1
    0,0,0,1,1,1,0,//按1按4
    0,0,1,0,1,0,1,//按3
    0,0,1,1,0,1,1,//按1按4
    0,1,0,0,1,0,0,//按4
    0,1,0,1,0,1,0,//按2
    0,1,1,0,0,0,1,//按2按4
    0,1,1,1,1,1,1,//不按
};//常量表
 
int minnum[9]={0,1,2,1,1,2,1,2,0};//對應(yīng)常量表8個狀態(tài)最少摁的次數(shù)

4.然后就可以開始寫代碼了,嘿嘿
核心代碼:

flag1=false;
for(i=1;i<9;i++)
{
    flag2=true;
    for(j=1;j<=n;j++)
    {
        if(dat[j]==-1)//如果沒有確定是亮或滅
            continue;
        tmp=j%6;//六位循環(huán)
        if(tmp==0)//如果是6的倍數(shù)
            tmp=6;
        if(dat[j]!=light[i][tmp])//有個燈不同說明不是這個狀態(tài),結(jié)束判斷
        {
            flag2=false;
            break;
        }
    }
    if(flag2==true&&c>=minnum[i])
    {
        flag1=true;//有一個滿足條件就標(biāo)記
        for(j=1;j<=n;j++)
        {
            tmp=j%6;
            if(tmp==0)
                tmp=6;
            cout<<light[i][tmp];
        }
        cout<<endl;
    }
}
if(flag1==false)
    cout<<"IMPOSSIBLE"<<endl;


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號