poj 1753

算法:

枚举第一行所有情况

 

说是水平

写了200行。。

wrong answer 了4次。。

犯了低级错误!!

#include <iostream>
#include <bitset>
using namespace std;

char gameborad[4][4] ;
int flag;
#define  INFINITE 0xFFFFFFF  
//满足要求与否
bool IsSatistied(char gameborad[4][4])
{
	for (int i = 0 ; i < 4 ; i++)
	{
		for (int j = 0 ; j < 4 ; j++)
		{
			if(gameborad[i][j] != gameborad[0][0]) 
			   return false;
		}
	}
	return true ;

}
//改变结点状态
void change(char gameborad[4][4],int i,int j)
{
	if (gameborad[i][j] == 'w')
	{
		gameborad[i][j] = 'b' ;
	}
	else
		gameborad[i][j] = 'w' ;

}
//切换某一点的开关状态引起的变化
void turn(char gameborad[4][4] ,int i,int j)
{
	change(gameborad,i,j) ;
	if (i > 0)
	{
		change(gameborad,i-1,j) ;
	}
	if (j > 0)
	{
		change(gameborad,i,j-1) ;
	}
	if (i < 3)
	{
		change(gameborad,i+1,j) ;
	}
	if (j < 3)
	{
		change(gameborad,i,j+1) ;
	}

}
//测试
int test(char gameborad[4][4])
{
	//保存原始矩阵值
	char originboard[4][4] ;
	for (int ii = 0 ; ii < 4 ; ++ii)
	{
		for (int jj = 0 ; jj < 4 ; ++jj)
		{
			originboard[ii][jj] = gameborad[ii][jj] ;
		}
	}
	//保存最后的步数结论,一共枚举2^4=16 次,分黑白
	int stepsw[16] ;
	int stepsb[16] ;
	int minsteps = INFINITE ;
	for (int m = 0 ; m <16 ;m++)
	{
		stepsb[m] = INFINITE ;
		stepsw[m] = INFINITE ;
	}
	//每次翻转哪些 0000-0001-...-1111
	bitset<4>   vecs[16] ;
	bitset<4>   vectemp  ;
	for (int bib = 0 ; bib < 16 ; bib ++)
	{
		vecs[bib] = bib ;
	}

	//开始16次枚举
	for (int i = 0 ; i < 16 ; ++i)
	{
	
		int steptow = 0; 
		int steptob = 0;
		vectemp = vecs[i] ;

		//回复原始棋盘
		for (int ii = 0 ; ii < 4 ; ++ii)
		{
			for (int jj = 0 ; jj < 4 ; ++jj)
			{
				gameborad[ii][jj] = originboard[ii][jj] ;
			}
		}
		//按照白色朝上
		//第一行
		for (int j = 0 ; j < 4 ; j++)
		{
			if (vectemp[j] == 1)
			{
				turn(gameborad,0,j) ;
				steptow++;
			}
		}
	    //
		for (int k = 1 ;k < 4 ; k ++)
		{
			for (int j = 0 ; j < 4 ; j++)
			{
				if (gameborad[k-1][j] == 'b')
				{
					turn(gameborad,k,j) ;
					steptow ++ ;
				}
			}
		}
		if (IsSatistied(gameborad))
			stepsw[i] = steptow ;

		//回复原始棋盘
		for (int iii = 0 ; iii < 4 ; ++iii)
		{
			for (int jj = 0 ; jj < 4 ; ++jj)
			{
				gameborad[iii][jj] = originboard[iii][jj] ;
			}
		}
		//第一行		
		//按照黑色朝上
		for (int bj1 = 0 ; bj1 < 4 ; bj1++)
		{
			if (vectemp[bj1] == 1)
			{
				turn(gameborad,0,bj1) ;
				steptob++;
			}
		}
		
		for (int kk = 1 ;kk < 4 ; kk ++)
		{
			for (int j = 0 ; j < 4 ; j++)
			{
				if (gameborad[kk-1][j] == 'w')
				{
					turn(gameborad,kk,j) ;
					steptob ++ ;
				}
			}
		}
		if (IsSatistied(gameborad))
			stepsb[i] = steptob ;
	}

	for (int num = 0 ; num < 16 ; num++)
	{
		if (stepsw[num] < minsteps)
		{
			minsteps = stepsw[num] ;
		}
		if (stepsb[num] < minsteps)
		{
			minsteps = stepsb[num] ;
		}
	}

	return minsteps ;
}

int main()
{
	//读入初始状态
	for (int i = 0 ;  i < 4 ; i++)
	{
		for (int j = 0 ; j < 4 ; j++)
		{
			cin >> gameborad[i][j] ;
		}
	}
	if (IsSatistied(gameborad))
	{
		cout << 0;
		return 0 ;
	}
	/*
	cout << endl ;
	turn(gameborad,2,2) ; 
	for ( i = 0 ;  i < 4 ; i++)
	{
		for (int j = 0 ; j < 4 ; j++)
		{
			cout << gameborad[i][j] ;
		}
		cout << endl ;
	}

	return 0 ;
	*/

	int steps = test(gameborad) ;
	if (steps != INFINITE)
	{
		cout << steps ;
	}
	else
		cout << "Impossible";
	

	return 0 ;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值