POJ 1753 FlipGame

这道题和之前做的熄灯问题很像,但还是花了很长时间,可能现在使用的算法还不是很好,等有时间再看看有什么其它好的解法。

犯的几个错误:

1、在做枚举的时候,终止条件设成了Press[1][4] ==1 

2、第二次枚举之前,没有将Press数组重置

3、输入数据的时候 用%c一个一个输入,这样的话会将回车也算到数组当中去,导致赋值不正确


真的需要多练习啊




#include <iostream>
#include <stdio.h>
using namespace std;

const int Row = 5;
const int Col = 6;
int MinStep = 1000;

int Puzzle[Row][Col] = {0};
int Press [Row][Col] = {0};
char status[4][4];

int Guess()
{

	//根据初始状态得出Press数组
	for(int i = 2; i < Row ;i++)
	{
		for(int j = 1 ;j < Col - 1; j++)
		{
			Press[i][j] = (Puzzle[i-1][j] + Press[i-2][j] + Press[i-1][j-1] + Press[i-1][j] + Press[i-1][j+1]) % 2 ;
		}
	}

	//根据Press数组得出最后一行的状态
    for(int i =1; i< Col -1; i++)
	{
		if(Puzzle[4][i] != (Press[3][i] + Press [4][i-1] + Press[4][i]+ Press[4][i+1])%2 )
			return -1;
	}

	int step = 0;
	for(int i = 1;i <= 4; i++)
	{
		for(int j =1; j<=4 ;j++)
		{
			if(Press[i][j] == 1)
				step ++ ;
		}
	}

	return step;
}

void Enumerator()
{
	int result = Guess();
	if(result >= 0 && result < MinStep)
		MinStep = result;

	while(1)
	{
		int j = 1;
		Press[1][j]++;
		while(Press[1][j] == 2)
		{
			Press[1][j+1]++;
			Press[1][j] = 0;
			j = j+1;
		}
		result = Guess();
		if(result >= 0 && result < MinStep)
			MinStep = result;

		if(Press[1][5]==1)
			break;
	}
}


int main()
{
	char c;
	for(int i =0 ;i <4;i++)
	{
		scanf("%s",&status[i]);
	}

    for(int i=0 ;i<4;i++)
	{
		for(int j=0; j<4;j++)
		{
			if(status[i][j] == 'b')
				Puzzle[i+1][j+1] = 1;
			else
				Puzzle[i+1][j+1] = 0;
		}
	}
	


	Enumerator();
	int nStep1 = MinStep;

	MinStep = 1000;

	for(int i=0 ;i<4;i++)
	{
		for(int j=0; j<4;j++)
		{
			if(status[i][j] == 'w')
				Puzzle[i+1][j+1] = 1;
			else
				Puzzle[i+1][j+1] = 0;
		}
	}

	for(int i =0 ;i<Row;i++)
	{
		for(int j =0 ; j<Col;j++)
			Press[i][j] = 0;
	}

	Enumerator();
	int nStep2 = MinStep;

	int nStep = (nStep1 > nStep2) ? nStep2:nStep1;
	if(nStep == 1000)
		cout<<"Impossible"<<endl;
	else
		cout<<nStep<<endl;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值