天天看點

能提高c語言程式設計的遊戲,[藍橋杯][算法提高VIP]開燈遊戲 (C語言代碼)

解題思路:

1.9個燈,各有0和1兩個狀态。對應着二進制的9個0到9個1(0~2^9)

2.周遊0~pow(2,9),

3.把上述周遊的每個值轉換成對應的9位二進制,并用一個數組分别存放各個位數。即代碼中的數組a,用函數bin_sep()實作

4.對3中的每個周遊值,從1~9号燈依次用循環周遊操作

5.執行完一次操作,用對n數組求和==4判斷是否輸出

注意事項:

1.對于解題思路中的3,要注意,每次把對應周遊的值轉換成的二進制,操作完相應操作後,都要把九個燈關閉,即把n數組全置零

2.memset()函數:

memset(數組名,置的元素,個數)

包含在頭檔案 中

參考代碼:

#include

#include

#include

using namespace std;

#define maxn 10

int a[10];  //a[1]=0表示第1個燈不按開關,反之則按一次開關

int n[maxn];//表示燈的狀态 0為關,1為開

void bin_sep(int x)

//把十進制的x轉化成二進制形式

//并把這個二進制形式的數按照數位分開放在一個數組中

{

memset(a,0,sizeof(a));

for(int i=9;x!=0&&i>=1;i--){

a[i]=x%2;

x=x/2;

}

}

int sum(int num[])//求和

{

int sum=0;

for(int i=1;i<=9;i++){

sum+=num[i];

}

return sum;

}

void doit(int k,int w)

{

if(k&&w)

switch(w)

{

case 1: n[2]=!n[2];n[4]=!n[4];break;

case 2: n[1]=!n[1];n[3]=!n[3];n[5]=!n[5];break;

case 3: n[2]=!n[2];n[6]=!n[6];break;

case 4: n[1]=!n[1];n[5]=!n[5];n[7]=!n[7];break;

case 5: n[2]=!n[2];n[4]=!n[4];n[6]=!n[6];n[8]=!n[8];break;

case 6: n[3]=!n[3];n[5]=!n[5];n[9]=!n[9];break;

case 7: n[4]=!n[4];n[8]=!n[8];break;

case 8: n[5]=!n[5];n[7]=!n[7];n[9]=!n[9];break;

case 9: n[6]=!n[6];n[8]=!n[8];break;

}

}

int main()

{

int num=0;

memset(n,0,sizeof(n));

for(int i=0;i<=pow(2,9);i++){  //9個燈,各有0和1兩個狀态。對應着二進制的9個0到9個1(0~2^9)

memset(n,0,sizeof(n));

bin_sep(i);               //把目前周遊到的數用9位二進制表示并拆放在a數組中

for(int j=1;j<=9;j++){    //從1号燈到9号燈,模拟燈的操作

doit(a[j],j);         //傳入對應數組的值,1就操作,0不操作;j是指對第幾個燈操作

}

if(sum(n)==4){            //如果對于數值i操作完後,恰有4個亮燈則輸出

for(int i=1;i<=9;i++){

cout<

if(i==9) {

memset(a,0,sizeof(a));

}

}

cout<

}

}

return 0;

}