解題思路:
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;
}