题目描述:
有9盏灯与9个开关,编号都是1~9。
每个开关能控制若干盏灯,按下一次会改变其控制的灯的状态(亮的变成不亮,不亮变成亮的)。
具体如下:
第一个开关控制第二,第四盏灯;
第二个开关控制第一,第三,第五盏灯;
第三个开关控制第二,第六盏灯;
第四个开关控制第一,第五,第七盏灯;
第五个开关控制第二,第四,第六,第八盏灯;
第六个开关控制第三,第五,第九盏灯;
第七个开关控制第四,第八盏灯;
第八个开关控制第五,第七,第九盏灯;
第九个开关控制第六,第八盏灯。
开始时所有灯都是熄灭的,开关是关闭着的。要求按下若干开关后,使得只有4盏灯亮着。
九个灯的亮和灭可以用0和1来表示,所以九展灯的亮灭可以用九位二进制来表示,即111111111,所以只需要:
- 遍历i:0~511
- 将i转化为2进制,即可得九个位置的状态
- 按照题目对值为1的开关进行状态转换
- 统计亮灯的个数
- 若为4,输出这个2进制数,否则进行i++
代码如下:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
bool deng[10];
int num[10];
int cnt;
int main(){
for(int i=0;i<=511;i++){
memset(deng,false,sizeof(deng));
memset(num,0,sizeof(num));
cnt = 9;
int tmp = i;
while(tmp){
num[cnt--] = tmp%2;
tmp/=2;
}
for(int j=1;j<=9;j++){
if(num[j]==1){
switch(j){
case 1:deng[2] = !deng[2];deng[4] = !deng[4];break;
case 2:deng[1] = !deng[1];deng[3] = !deng[3];
deng[5] = !deng[5];break;
case 3:deng[2] = !deng[2];deng[6] = !deng[6];break;
case 4:deng[1] = !deng[1];deng[5] = !deng[5];
deng[7] = !deng[7];break;
case 5:deng[2] = !deng[2];deng[4] = !deng[4];
deng[6] = !deng[6];deng[8] = !deng[8];break;
case 6:deng[3] = !deng[3];deng[5] = !deng[5];
deng[9] = !deng[9];break;
case 7:deng[8] = !deng[8];deng[4] = !deng[4];break;
case 8:deng[7] = !deng[7];deng[5] = !deng[5];
deng[9] = !deng[9];break;
case 9:deng[6] = !deng[6];deng[8] = !deng[8];break;
}
}
}
int light=0;
for(int j=1;j<=9;j++){
if(deng[j]) light++;
}
if(light==4){
for(int j=1;j<=9;j++){
cout<<num[j];
}
cout<<endl;
}
}
return 0;
}
memset函数的原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组,c:是赋给buffer的值,count:是buffer的长度。 Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;
所以memset函数将deng数组的值全部设置为false,num数组的值全部设置为0,也就是没有按下开关的情况
memset(deng,false,sizeof(deng));
memset(num,0,sizeof(num));
cnt = 9;
int tmp = i;
while(tmp){
num[cnt--] = tmp%2;
tmp/=2;
}
这一部分的代码用来记录i=某个值时能够按下去的按钮数量,加入i=511,那么num[]=111111111,也就是九个按钮都可以按下去。
中间的for循环就是用来验证按钮被按下去时,灯的亮与灭
最后统计亮的灯的数量light,如果亮着的灯数量为4,那么输出按下开关的顺序