问题 1520: [蓝桥杯][算法提高VIP]开灯游戏

题目

解题思路:

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;
}

猜你喜欢

转载自blog.csdn.net/Exaggeration08/article/details/87918105