记录编号 33952 评测结果 AAAAAAAAAA
题目名称 [NOIP 2011]玛雅游戏 最终得分 100
用户昵称 GravatarCzb。 是否通过 通过
代码语言 C++ 运行时间 2.157 s
提交时间 2011-11-23 19:05:15 内存使用 1.96 MiB
显示代码纯文本
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct aaa
{
	int t[6];
	int c[6][8];
	aaa()
	{
		memset(t,0,sizeof(t));
		memset(c,0,sizeof(c));
	}
};

int n,ans[6][3];

bool flag,b[6][8];

aaa solve(aaa g)
{
	aaa h;
	int i,j;
	for(i=1;i<=5;i++)
	{
		for(j=1;j<=g.t[i];j++)
		{
			if(g.c[i][j]&&!b[i][j])
			{
				h.t[i]++;
				h.c[i][h.t[i]]=g.c[i][j];
			}
		}
	}
	return h;
}

aaa clear(aaa g)
{
	int i,j;
	aaa h;
	flag=false;
	memset(b,0,sizeof(b));
	for(i=1;i<=5;i++)
	{
		for(j=1;j<=g.t[i];j++)
		{
			if(i<=3)
			{
				if(g.c[i][j]==g.c[i+1][j]&&g.c[i][j]==g.c[i+2][j])
				{
					b[i][j]=b[i+1][j]=b[i+2][j]=true;
					flag=true;
				}
			}
			if(j<=g.t[i]-2)
			{
				if(g.c[i][j]==g.c[i][j+1]&&g.c[i][j]==g.c[i][j+2])
				{
					b[i][j]=b[i][j+1]=b[i][j+2]=true;
					flag=true;
				}
			}
		}
	}
	if(flag)
	{
		h=solve(g);
		return clear(h);
	}
	else
	{
		return g;
	}
}

void output()
{
	freopen("mayan.out","w",stdout);
	int i;
	for(i=1;i<=n;i++)
	{
		printf("%d %d %d\n",ans[i][0],ans[i][1],ans[i][2]);
	}
	exit(0);
}

void dfs(aaa g,int k)
{
	int i,j,l;
	aaa h;
	flag=true;
	for(i=1;i<=5;i++)
	{
		if(g.t[i])
		{
			flag=false;
			break;
		}
	}
	if(flag)
	{
		if(k>n)
		{
			output();
		}
		else
		{
			return;
		}
	}
	if(k>n)
	{
		return;
	}
	for(i=1;i<=5;i++)
	{
		for(j=1;j<=g.t[i];j++)
		{
			if(i<5)
			{
				if(j>g.t[i+1])
				{
					h=g;
					h.t[i+1]++;
					h.c[i+1][h.t[i+1]]=h.c[i][j];
					h.c[i][j]=0;
					h.t[i]--;
					for(l=j;l<=h.t[i];l++)
					{
						h.c[i][l]=h.c[i][l+1];
					}
					h=clear(h);
					ans[k][0]=i-1;
					ans[k][1]=j-1;
					ans[k][2]=1;
					dfs(h,k+1);
				}
				else
				{
					h=g;
					l=h.c[i][j];
					h.c[i][j]=h.c[i+1][j];
					h.c[i+1][j]=l;
					h=clear(h);
					ans[k][0]=i-1;
					ans[k][1]=j-1;
					ans[k][2]=1;
					dfs(h,k+1);
				}
			}
			if(i>1)
			{
				if(j>g.t[i-1])
				{
					h=g;
					h.t[i-1]++;
					h.c[i-1][h.t[i-1]]=h.c[i][j];
					h.c[i][j]=0;
					h.t[i]--;
					for(l=j;l<=h.t[i];l++)
					{
						h.c[i][l]=h.c[i][l+1];
					}
					h=clear(h);
					ans[k][0]=i-1;
					ans[k][1]=j-1;
					ans[k][2]=-1;
					dfs(h,k+1);
				}
			}
		}
	}
}

int main()
{
	freopen("mayan.in","r",stdin);
	freopen("mayan.out","w",stdout);
	int i,j;
	aaa g;
	scanf("%d",&n);
	for(i=1;i<=5;i++)
	{
		scanf("%d",&j);
		while(j)
		{
			g.t[i]++;
			g.c[i][g.t[i]]=j;
			scanf("%d",&j);
		}
	}
	dfs(g,1);
	printf("-1\n");
	return 0;
}