记录编号 |
203221 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2011]玛雅游戏 |
最终得分 |
100 |
用户昵称 |
forever |
是否通过 |
通过 |
代码语言 |
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;
}