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