解题思路:
1. 一个开关有两种操作:开和关,9个开关总共有2^9种情况。把每一种情况转换为对应的二进制(9位0,1)。
2. 每个开关控制若干盏灯,灯的初始状态为关,若某个开关为开状态,则对应的灯状态由0(关)变为1(开),也就是一个取!(非)操作。
3. 最后统计灯的开关状态,若有4盏灯亮着,则输出开关对应的二进制。
参考博客:http://www.dotcpp.com/oj/problem1520.html
源码附上:
#include <iostream>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
int A[10], B[10];//B[i]=0表示关,1表示开
void switchBinary(int n)
{
for (int i = 9; i > 0 && n > 0; i--)
{
A[i] = n % 2;
n /= 2;
}
}
void operation()
{
for (int i = 1; i <= 9; i++)
{
if (A[i] == 1)
{
switch (i)
{
case 1:B[2] = !B[2]; B[4] = !B[4]; break;
case 2:B[1] = !B[1]; B[3] = !B[3]; B[5] = !B[5]; break;
case 3:B[2] = !B[2]; B[6] = !B[6]; break;
case 4:B[1] = !B[1]; B[5] = !B[5]; B[7] = !B[7]; break;
case 5:B[2] = !B[2]; B[4] = !B[4]; B[6] = !B[6]; B[8] = !B[8]; break;
case 6:B[3] = !B[3]; B[5] = !B[5]; B[9] = !B[9]; break;
case 7:B[4] = !B[4]; B[8] = !B[8]; break;
case 8:B[5] = !B[5]; B[7] = !B[7]; B[9] = !B[9]; break;
case 9:B[6] = !B[6]; B[8] = !B[8]; break;
}
}
}
}
int sum()
{
int count = 0;
for (int i = 1; i <= 9; i++)
{
count += B[i];
}
return count;
}
int main()
{
for (int i = 1; i <= pow(2, 9); i++)
{
memset(A, 0, sizeof(A));
switchBinary(i);//将开关状态转换为二进制
memset(B, 0, sizeof(B));
operation();
if (sum() == 4)
{
for (int j = 1; j <= 9; j++)
cout << A[j];
cout << endl;
}
}
return 0;
}