思路:
首先得知道要使全部灯都恰好熄灭,由第一行的灯来决定,也就是我们只需要通过枚举的方法来遍历第一行灯熄灭的所有排列方式也就是2的6次方-1个(0~63),直到最后一行也全部熄灭来作为结束条件。
代码如下:
#include <bitset>
#include <memory>
#include <cstring>
#include <iostream>
using namespace std;
bitset<6> source[5], result[5], lights[5];
bitset<6> line;
void input_source()
{
int x;
for (int i = 0; i < 5; i++)
for (int j = 0; j < 6; j++)
{
cin >> x;
source[i][j] = x;
}
}
void output_result()
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 6; j++)
cout << result[i][j] << " ";
cout << endl;
}
}
int main()
{
int t = 0;
cin >> t;
for (int i = 0; i < t; i++)
{
input_source();
for (int n = 0; n < 64; n++)
{
memcpy(lights, source, sizeof(source));
line = n;
for (int k = 0; k < 5; k++)
{
result[k] = line;
for (int j = 0; j < 6; j++)
{
if (line.test(j))
{
lights[k][j].flip();
lights[k + 1][j].flip();
if (j > 0) lights[k][j - 1].flip();
if (j < 5) lights[k][j + 1].flip();
}
}
line = lights[k];
}
if (lights[4].none())
{
cout << "PUZZLE #" << i + 1 << endl;
output_result();
break;
}
}
}
}
代码难点:
用二进制0,1形成的矩阵来代替灯的熄灭的情况,这里调用了bitset库定义了一个5行6bit的组合,之后就根据题意分析写