POJ 1753 Flip Game DFS枚举

看题传送门:http://poj.org/problem?id=1753

DFS枚举的应用。

基本上是参考大神的。。。。

学习学习。。


#include<cstdio>
#include<iostream>
using namespace std;
int n,s,d,ans;
bool a[5][5],flag=false;

//判断全部一样的情况
bool alllike()
{
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)	
			if(a[i][j]!=a[0][0])
				return false;

	return true;
}

//翻转棋
void flip(int r,int c)
{
	if(r>0)	
			a[r-1][c]=!a[r-1][c];
	
	if(c>0)		
			a[r][c-1]=!	a[r][c-1];

	if(r<3)
			a[r+1][c]=!a[r+1][c];

	if(c<3)
			a[r][c+1]=!a[r][c+1];

	a[r][c]=!a[r][c];
}

void dfs(int r,int c,int deep)
{
	if(deep==ans)
	{
		flag=alllike();
		return;
	}

	if(r==4||flag) 
		return;

	flip(r,c);		//翻转棋

	if(c<3)
		dfs(r,c+1,deep+1);
	else 
		dfs(r+1,0,deep+1);

	flip(r,c);		//把棋翻回来
	
	if(c<3)			//如果不满足则不翻转该棋
		dfs(r,c+1,deep);
	else 
		dfs(r+1,0,deep);

	return;
}

int main()
{
	char c;
	for(int i=0;i<4;i++)	
		for(int j=0;j<4;j++)
		{
			scanf("%c",&c);
			if(j==3)
				getchar();
		//	cin>>c;        //直接用cin也可以
				if(c=='b')
					a[i][j]=true;
				else 
					a[i][j]=false;
		}

	for(ans=0;ans<=16;ans++)
	{
		dfs(0,0,0);
		if(flag)
			break;
	}

	if(flag)
		printf("%d\n",ans);
	else
		printf("Impossible\n");
	
}


posted @ 2013-09-28 11:45  hr_whisper  阅读(136)  评论(0编辑  收藏  举报