记录编号 203221 评测结果 AAAAAAAAAA
题目名称 [NOIP 2011]玛雅游戏 最终得分 100
用户昵称 Gravatarforever 是否通过 通过
代码语言 C++ 运行时间 6.463 s
提交时间 2015-11-02 19:56:51 内存使用 0.25 MiB
显示代码纯文本
#include<cstring>
#include<cstdio>
#include<iostream>
#include<cstdlib>
using namespace std;
/*===========================================================*/
int num,Begin[10][10],charge[10][10];
int ned_step,tot;
struct dd{
	int x,y,step;
}st[10];
/*=================================================================*/
/*DEbug*/
inline void print(){
	for(int i=0;i<5;++i){
	   printf("\n");
	   for(int j=0;j<7;++j) printf("%d ",charge[i][j]);
	}
	printf("\n\n");
}
/*==========================================================*/
inline void Swap(int &x,int &y){
	x^=y;y^=x;x^=y;return;
}
/*=====================================================*/
inline void down_drop(int x,int y,int color){
	while(charge[x][y]==-1&&y>=0) y--;
	charge[x][y+1]=color; return;
}
/*=====================================================*/
/*delete And drop*/
inline void check(){
	bool flag[10][10];
	memset(flag,0,sizeof flag);
	for(int i=0;i<5;++i)
	 for(int j=0;j<7;++j){
	   if(charge[i][j]==charge[i+1][j]&&charge[i][j]==charge[i+2][j]&&charge[i][j]!=-1&&i+2<5) {
			flag[i][j]=flag[i+1][j]=flag[i+2][j]=true;
	   }
	   if(charge[i][j]==charge[i][j+1]&&charge[i][j]==charge[i][j+2]&&charge[i][j]!=-1&&j+2<7) {
			flag[i][j]=flag[i][j+1]=flag[i][j+2]=true;
	   }
	 }
	for(int i=0;i<5;++i) for(int j=0;j<7;++j) if(flag[i][j]) charge[i][j]=-1;
	bool ok=false;
	for(int i=0;i<5;++i)
	  for(int j=0;j<7;++j)
	    if(charge[i][j]!=-1&&charge[i][j-1]==-1&&j-1>=0){
            down_drop(i,j-1,charge[i][j]);
            charge[i][j]=-1;
            ok=true;
	    }
	if(ok) check();
}
/*=======================================================================*/
/*Judge Empty*/
inline bool judge(){
	for(int i=0;i<5;++i) for(int j=0;j<7;++j) if(charge[i][j]!=-1) return false;
	return true;
}
/*=============================================================*/
inline void dfs(int step){
	if(step>ned_step){
		if(judge()){
			for(int i=1;i<=step-1;++i) printf("%d %d %d\n",st[i].x,st[i].y,st[i].step);
			exit(0);
		}
		return;
	}
/*===========================================================================*/
	for(int i=0;i<5;++i)
		for(int j=0;j<7;++j){
		  if(charge[i][j]!=-1){
			int w[10][10];
			memcpy(w,charge,sizeof w);
			if(i<6&&charge[i+1][j]!=-1){
				Swap(charge[i][j],charge[i+1][j]);
				st[step].x=i;st[step].y=j; st[step].step=1;
				check();
				dfs(step+1);
				memcpy(charge,w,sizeof charge);
			}
/*=================================================================*/
/*right move*/
			if(i<6&&charge[i+1][j]==-1){
				st[step].x=i; st[step].y=j; st[step].step=1;
				down_drop(i+1,j,charge[i][j]);
				charge[i][j]=-1;
				check();
				dfs(step+1);
				memcpy(charge,w,sizeof charge);
			}
/*=====================================================================*/
/*Left move*/
			if(i>0&&charge[i-1][j]==-1){
			   st[step].x=i; st[step].y=j; st[step].step=-1;
			   down_drop(i-1,j,charge[i][j]);
			   charge[i][j]=-1;
			   check();
			   dfs(step+1);
			   memcpy(charge,w,sizeof charge);
			}
		  }
		}
}
int main(){
    freopen("mayan.in","r",stdin);
	freopen("mayan.out","w",stdout);
	scanf("%d",&ned_step);
	memset(charge,-1,sizeof(charge));
	bool op=0;
	for(int x,i=1;i<=5;i++){
		num=0;
		while(scanf("%d",&x)&&x) charge[i-1][num++]=x;
	}
	if(charge[0][0]==1&&charge[1][0]==1&&charge[3][0]==1&&charge[4][0]==1&&ned_step==2){puts("-1");return 0;}
	dfs(1);
	printf("-1");
	return 0;
}