记录编号 203042 评测结果 AAAAAAAAAA
题目名称 [NOIP 2011]玛雅游戏 最终得分 100
用户昵称 Gravatarzys 是否通过 通过
代码语言 C++ 运行时间 8.009 s
提交时间 2015-11-02 15:02:02 内存使用 0.20 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>

using namespace std;

int n,st[10][10],now[10][10],cnt;

struct Get_Ans{
	int x,y,opt;
}Ans[10],temp_Ans[10],temp_ans[10];

bool check_hl(int x,int y)
{
	if(now[x][y]==now[x-1][y])
		return (now[x-1][y]==now[x-2][y]);
	return false;
}
bool check_lx(int x,int y)
{
	if((now[x][y]==now[x][y-1]))
		return (now[x][y-1]==now[x][y-2]);
	return false;
}

bool Check_tot()
{
	bool del[10][10];int temp_cnt=cnt;memset(del,0,sizeof(del));
	for(int i=0;i<5;i++)for(int j=0;j<7;j++){
		if(i>=2){
			if(!now[i][j])continue;
			if(check_hl(i,j))del[i][j]=del[i-1][j]=del[i-2][j]=1;
		}
		if(j>=2){
			if(!now[i][j])continue;
			if(check_lx(i,j))del[i][j]=del[i][j-1]=del[i][j-2]=1;
		}
	}
	for(int i=0;i<5;i++)for(int j=6;j>=0;j--)if(del[i][j]){
		now[i][j]=0;int temp=j;cnt--;
		while(temp<7){
			now[i][temp]=now[i][temp+1];
			if(!now[i][temp+1])break;temp++;
		}
	}
	if(cnt<temp_cnt)return true;
	return false;
}

void Drag(int x,int y)
{
	now[x][y]^=now[x+1][y];
	now[x+1][y]^=now[x][y];
	now[x][y]^=now[x+1][y];
	while(Check_tot());
}

void Drag_right_empty(int x,int y)
{
	int temp=y;while(!now[x+1][temp-1]&&temp-1>=0)temp--;
	now[x+1][temp]=now[x][y];temp=y;
	while(temp<7){
		now[x][temp]=now[x][temp+1];
		if(!now[x][temp+1])break;temp++;
	}
	while(Check_tot());
}

void Drag_left_empty(int x,int y)
{
	int temp=y;while(!now[x-1][temp-1]&&temp-1>=0)temp--;
	now[x-1][temp]=now[x][y];temp=y;
	while(temp<7){
		now[x][temp]=now[x][temp+1];
		if(!now[x][temp+1])break;temp++;
	}
	while(Check_tot());
}

bool comp()
{
	for(int i=1;i<=n;i++){
		if(Ans[i].x==temp_Ans[i].x){
			if(Ans[i].y==temp_Ans[i].y){
				if(Ans[i].opt==temp_Ans[i].opt)continue;
				else{
					if(Ans[i].opt>temp_Ans[i].opt)return false;
					else return true;
				}
			}
			else{
				if(Ans[i].y>temp_Ans[i].y)return true;
				else return false;
			}
		}
		else{
			if(Ans[i].x<temp_Ans[i].x)return false;
			else return true;
		}
	}
	return false;
}

void dfs(int dth)
{
	if(dth<n&&(!cnt))return;
	if(dth==n){
		if(!cnt){
			if(comp()){
				for(int i=1;i<=dth;i++){
					Ans[i].x=temp_Ans[i].x;
					Ans[i].y=temp_Ans[i].y;
					Ans[i].opt=temp_Ans[i].opt;
				}
			}
		}
		return;
	}
	int temp[10][10],temp_cnt=cnt;
	memcpy(temp,now,sizeof(now));
	memcpy(temp_ans,temp_Ans,sizeof(temp_Ans));
	for(int i=0;i<5;i++){
		for(int j=0;j<7;j++){
			if(!now[i][j])continue;
			if(now[i][j]!=now[i+1][j]){
				if(now[i+1][j]){
					Drag(i,j);temp_Ans[dth+1].x=i;
					temp_Ans[dth+1].y=j;temp_Ans[dth+1].opt=1;
					dfs(dth+1);cnt=temp_cnt;memcpy(now,temp,sizeof(now));
					memcpy(temp_Ans,temp_ans,sizeof(temp_Ans));
				}
				else{
					if(i+1<5){
						Drag_right_empty(i,j);temp_Ans[dth+1].x=i;
						temp_Ans[dth+1].y=j;temp_Ans[dth+1].opt=1;dfs(dth+1);
						cnt=temp_cnt;memcpy(now,temp,sizeof(now));
						memcpy(temp_Ans,temp_ans,sizeof(temp_Ans));
					}
				}
			}
			if(now[i-1][j]||(i-1)<0)continue;
			Drag_left_empty(i,j);temp_Ans[dth+1].x=i;
			temp_Ans[dth+1].y=j;temp_Ans[dth+1].opt=-1;
			dfs(dth+1);cnt=temp_cnt;memcpy(now,temp,sizeof(now));
			memcpy(temp_Ans,temp_ans,sizeof(temp_Ans));
		}
	}
}

int main()
{
    freopen("mayan.in","r",stdin);
	freopen("mayan.out","w",stdout);
	scanf("%d",&n);
	for(int i=0;i<5;i++){
	    int j=0;scanf("%d",&st[i][j]);
	    now[i][j]=st[i][j];
		while(st[i][j]!=0){
			cnt++;j++;scanf("%d",&st[i][j]);
			now[i][j]=st[i][j];
		}
	}
	for(int i=0;i<=5;i++)Ans[i].x=Ans[i].y=0x2fffffff;
	dfs(0);
	if(Ans[1].opt==0)printf("-1");
	else {
		for(int i=1;i<=n;i++)
			printf("%d %d %d\n",Ans[i].x,Ans[i].y,Ans[i].opt);
	}
}