现在的位置: 首页 > 综合 > 正文

poj 1753 Flip Game

2018年04月29日 ⁄ 综合 ⁄ 共 1028字 ⁄ 字号 评论关闭

本题就是枚举所有情况,然后一个个深搜,符合条件就跳出。。

但要有剪枝,不然会超时。

#include<stdio.h>
#include<string.h>
int s[4][4];
int m[4][4],flag,step;

int qq()
{
	int i,j;
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			if(m[i][j]!=m[0][0])
				return 0;
		}
	}
	return 1;
}

void yy(int r,int t)
{
	m[r][t]=!m[r][t];
	if(r<3)
		m[r+1][t]=!m[r+1][t];
	if(r>0)
		m[r-1][t]=!m[r-1][t];
	if(t>0)
		m[r][t-1]=!m[r][t-1];
	if(t<3)
		m[r][t+1]=!m[r][t+1];
}

//void show(int u,int g,int h)
{
	int i,j,d;
	if(u==step)
	{
		d=qq();
		if(d)
			flag=1;
		return ;
	}
	if(flag||g==4)
		return ;
	for(i=g;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			if(s[i][j]==0)
			{
			yy(i,j);
			s[i][j]=1;
			show(u+1,i,j);
			if(flag)
				return ;
			s[i][j]=0;
			yy(i,j);
			}
		}
	}

}(这是超时的搜索。)
void show(int u,int g,int h)
{
	int i,j,d;
	if(u==step)
	{
		d=qq();
		if(d)
			flag=1;
		return ;
	}
	if(flag||g==4)
		return ;
	yy(g,h);
	if(h<3)
		show(u+1,g,h+1);
	else
		show(u+1,g+1,0);
	yy(g,h);
	if(h<3)
		show(u,g,h+1);
	else
		show(u,g+1,0);
}

int main()
{

	int i,j;
	char a;
	memset(s,0,sizeof(s));
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			scanf("%c",&a);
			if(a=='b')
			{
				m[i][j]=0;
			}
			else
				m[i][j]=1;
		}
		getchar();
	}
	for(step=0;step<=16;step++)
	{
		flag=0;
		show(0,0,0);
		if(flag)
			break;
	}
	if(flag)
	   printf("%d\n",step);
	else
		printf("Impossible\n");
	return 0;
}

抱歉!评论已关闭.