记录编号 429974 评测结果 AAAAAAAAAA
题目名称 [NOIP 2011]玛雅游戏 最终得分 100
用户昵称 GravatarAnonymity 是否通过 通过
代码语言 C++ 运行时间 1.690 s
提交时间 2017-07-29 07:14:18 内存使用 0.32 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#define mem(a,b) memset(a,b,sizeof(a))
#define cop(a,b) memcpy(a,b,sizeof(b))
using namespace std;
int n,b[10][10],cnt,st[10],st2[10],st3[10];
bool ok[10][10];
inline int read()
{   char c=getchar();int x=0;
    while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    return x;
}
bool wipe()
{
	mem(ok,0);bool fu=0;
	for(int i=1;i<=5;i++)
		for(int j=1;j<=7;j++)
		{	if(b[i][j]&&b[i][j]==b[i][j+1]&&b[i][j]==b[i][j+2]) ok[i][j]=ok[i][j+1]=ok[i][j+2]=1;
			if(b[i][j]&&b[i][j]==b[i+1][j]&&b[i][j]==b[i+2][j]) ok[i][j]=ok[i+1][j]=ok[i+2][j]=1;
		}
	for(int i=1;i<=5;i++) for(int j=1;j<=7;j++) if(ok[i][j]) b[i][j]=0,fu=1;
	return fu;
}
void fall(){for(int i=1;i<=5;i++){int j=2;while(j<=7){while(j>1&&b[i][j]&&!b[i][j-1]) b[i][j-1]=b[i][j],b[i][j]=0,j--; j++;}}}
bool check(){for(int i=1;i<=5;i++) for(int j=1;j<=7;j++) if(b[i][j]!=0) return 0; return 1;}
void print(){for(int i=1;i<=cnt;i++) printf("%d %d %d\n",st[i]-1,st2[i]-1,st3[i]);exit(0);}
void move(int x,int y,int ai,int bi){int tmp=b[ai][bi];b[ai][bi]=b[x][y];b[x][y]=tmp;}
void mark(int x,int y,int z){st[cnt]=x;st2[cnt]=y;st3[cnt]=z;}
void dfs()
{
	if(cnt==n) if(check()) print();else return;
	for(int i=1;i<=5;i++)
		for(int j=1;j<=7;j++)
		{
			if(!b[i][j]) break;
			int tmp[10][10];
			cop(tmp,b);
			if(i<5)
			{	cnt++;move(i,j,i+1,j);mark(i,j,1);
				while(1){fall();if(!wipe()) break;}
				dfs();cnt--;cop(b,tmp);
			}
			if(i>1&&!b[i-1][j]) 
			{	cnt++;move(i,j,i-1,j);mark(i,j,-1);
				while(1){fall();if(!wipe()) break;}
				dfs();cnt--;cop(b,tmp);
			}
		}
}
int main()
{
	freopen("mayan.in","r",stdin);
	freopen("mayan.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=5;i++)
		for(int j=1;;j++)
		{	scanf("%d",&b[i][j]);
			if(!b[i][j]) break;
		}
	dfs();
	printf("-1");
	return 0;
}