记录编号 |
188403 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2011]玛雅游戏 |
最终得分 |
100 |
用户昵称 |
stdafx.h |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.714 s |
提交时间 |
2015-09-23 08:28:21 |
内存使用 |
0.31 MiB |
显示代码纯文本
//n=7 m=5
#define MAXN 8UL
#define REP for(int i=7;i>0;i--) for(int j=1;j<6;j++)
#define LEFT -1
#define RIGHT 1
#define MAXR 12UL
#include <cstdio>
#include <vector>
int r,limited_step,Map_Now[MAXN][MAXN],gs_now[MAXN];
bool can_arch;
struct Point{
int x,y,sp;
inline void Prx(){printf("%d %d %d\n",y-1,7-x,sp);return;}
};
std::vector<Point> Move_now;
struct Backup{
int Map[MAXN][MAXN],gs[MAXR];
inline void Restore(){REP Map_Now[i][j]=Map[i][j];for(int i=1;i<r;i++) gs_now[i]=gs[i];return;}
inline void Copy(){REP Map[i][j]=Map_Now[i][j];for(int i=1;i<r;i++) gs[i]=gs_now[i];return;}
};
inline bool Check_Ok(){for(int i=1;i<=5;i++) if(Map_Now[7][i]) return false;return true;}
inline void Del_Move(){Move_now.pop_back();return;}
inline Point Mk(int x,int y,int k){Point temp;temp.x=x;temp.y=y;temp.sp=k;return temp;}
inline void Add_Move(int x,int y,int mk){Move_now.push_back(Mk(x,y,mk));return;}
inline void Ans_prx(){int s=Move_now.size();for(int i=0;i<s;i++) Move_now[i].Prx();return;}
inline bool Pos_ok(int x,int y){return x>0&&x<8&&y>0&&y<6;}
inline void Push_Down(int x,int y){while(x!=7&&Map_Now[x+1][y]==0) Map_Now[x+1][y]=Map_Now[x][y],Map_Now[x++][y]=0;return;}
inline void Map_Push(int k){for(int i=7;i>0;i--) Push_Down(i,k);return;}
inline bool Sci(){for(int i=1;i<r;i++) if(gs_now[i]>0&&gs_now[i]<3) return true;return false;}
inline bool Killable_X(int x,int y){return Map_Now[x][y+1]==Map_Now[x][y]&&Map_Now[x][y+2]==Map_Now[x][y];}
inline bool Killable_Y(int x,int y){return Map_Now[x+1][y]==Map_Now[x][y]&&Map_Now[x+2][y]==Map_Now[x][y];}
inline void Pm(int p){if(p>r) r=p;return;}
inline void Check_Clr(){
while(true){
bool killed=false,Kmap[MAXN][MAXN]={0};
for(int i=7;i>0;i--) for(int j=1;j<4;j++) if(Map_Now[i][j]&&Killable_X(i,j)) killed=true,Kmap[i][j]=Kmap[i][j+1]=Kmap[i][j+2]=true;
for(int i=5;i>0;i--) for(int j=1;j<6;j++) if(Map_Now[i][j]&&Killable_Y(i,j)) killed=true,Kmap[i][j]=Kmap[i+1][j]=Kmap[i+2][j]=true;
for(int j=1;j<=5;j++){
bool Rb=false;
for(int i=7;i>0&&Map_Now[i][j];i--) if(Kmap[i][j]) Rb=true,--gs_now[Map_Now[i][j]],Map_Now[i][j]=0;
if(Rb) Map_Push(j);
}
if(!killed) break;
}return;
}
inline bool Move(int x,int y,int op){
if((!Pos_ok(x,y+op))||Map_Now[x][y+op]==Map_Now[x][y]) return false;
if(Map_Now[x][y+op]){Map_Now[x][y]^=Map_Now[x][y+op];Map_Now[x][y+op]^=Map_Now[x][y];Map_Now[x][y]^=Map_Now[x][y+op];}
else Map_Now[x][y+op]=Map_Now[x][y],Map_Now[x][y]=0,Map_Push(y),Map_Push(y+op);
Check_Clr();return true;
}
inline void dfs(int step){
if(Sci()) return;
if(Check_Ok()){if(step==limited_step) can_arch=true,Ans_prx();return;}
if(step==limited_step) return;
Backup backup;backup.Copy();
for(int j=1;j<=5;j++){
for(int i=7;i>0&&Map_Now[i][j];i--){
if(Move(i,j,RIGHT)) Add_Move(i,j,RIGHT),dfs(step+1),backup.Restore(),Del_Move();
if(can_arch) return;
if((!Map_Now[i][j-1])&&Move(i,j,LEFT) ) Add_Move(i,j,LEFT ),dfs(step+1),backup.Restore(),Del_Move();
if(can_arch) return;
}
}
return;
}
int main(){
freopen("mayan.in","r",stdin);freopen("mayan.out","w",stdout);
scanf("%d",&limited_step);
for(int i=1,s,j=7;i<=5;i++,j=7) while(scanf("%d",&s)&&s) Map_Now[j--][i]=s,Pm(s),++gs_now[s];
r++;dfs(0);if(!can_arch) puts("-1");
return 0;
}