【poj刷题记录】1753:Flip Game

枚举入门练习,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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值