枚举入门练习,POJ1753题目描述如下:
此题其实就是枚举中的一个典型问题——熄灯问题(对具体思路感兴趣的同学可以在华文慕课上搜索北大的程序设计实习,查看里面枚举部分有关熄灯问题的课件,出于版权问题,这里只能给出该课程网址的传送门,不能直接给出课件,该课程是完全免费全年开放的),只不过多加了一个对于全亮/全按两种结果步骤多少的判断,具体代码如下:
#include <iostream>
using namespace std;
int input[6][6] = { 0 }, flip[6][6] = { 0 };
int b_w = 0, b_time = 17, w_time = 17;
bool guess()
{
for (int i = 1; i < 4; i++)
for (int j = 1; j < 5; j++)
flip[i + 1][j] = (input[i][j] + flip[i][j + 1] + flip[i][j - 1] + flip[i][j] + flip[i - 1][j]) % 2;
for (int i = 1; i < 5; i++)
if ((flip[4][i] + flip[4][i - 1] + flip[4][i + 1] + flip[3][i]) % 2 != input[4][i])
return false;
return true;
}
void get_time()
{
int temp_time = 0;
for (int i = 1; i < 5; i++)
for (int j = 1; j < 5; j++)
if (flip[i][j] == 1)
temp_time++;
if ((b_w == 0) && (b_time > temp_time))
b_time = temp_time;
else if ((b_w == 1) && (w_time > temp_time))
w_time = temp_time;
}
void calculate()
{
for (flip[1][1] = 0; flip[1][1] < 2; flip[1][1]++)
for (flip[1][2] = 0; flip[1][2] < 2; flip[1][2]++)
for (flip[1][3] = 0; flip[1][3] < 2; flip[1][3]++)
for (flip[1][4] = 0; flip[1][4] < 2; flip[1][4]++)
if (guess() == true)
get_time();
}
int main()
{
char ch;
for (int i = 1; i < 5; i++)
{
for (int j = 1; j < 5; j++)
{
cin >> ch;
if (ch == 'b')
input[i][j] = 1;
}
}
calculate();
b_w = 1;
for (int i = 1; i < 5; i++)
{
for (int j = 1; j < 5; j++)
{
flip[i][j] = 0;
if (input[i][j] == 0)
input[i][j] = 1;
else
input[i][j] = 0;
}
}
calculate();
if (b_time == 17 && w_time == 17)
cout << "Impossible" << endl;
else if (b_time < w_time)
cout << b_time << endl;
else
cout << w_time << endl;
return 0;
}