洛谷P1312 Mayan遊戲
P1312 Mayan遊戲
題目描述
Mayan puzzle是最近流行起來的一個遊戲。遊戲界面是一個 7 行5 列的棋盤,上面堆放著一些方塊,方塊不能懸空堆放,即方塊必須放在最下面一行,或者放在其他方塊之上。遊戲通關是指在規定的步數內消除所有的方塊,消除方塊的規則如下:
1 、每步移動可以且僅可以沿橫向(即向左或向右)拖動某一方塊一格:當拖動這一方塊時,如果拖動後到達的位置(以下稱目標位置)也有方塊,那麽這兩個方塊將交換位置(參見輸入輸出樣例說明中的圖6 到圖7 );如果目標位置上沒有方塊,那麽被拖動的方塊將從原來的豎列中抽出,並從目標位置上掉落(直到不懸空,參見下面圖1 和圖2);
2 、任一時刻,如果在一橫行或者豎列上有連續三個或者三個以上相同顏色的方塊,則它們將立即被消除(參見圖1 到圖3)。
註意:
a) 如果同時有多組方塊滿足消除條件,幾組方塊會同時被消除(例如下面圖4 ,三個顏色為1 的方塊和三個顏色為 2 的方塊會同時被消除,最後剩下一個顏色為 2 的方塊)。
b) 當出現行和列都滿足消除條件且行列共享某個方塊時,行和列上滿足消除條件的所有方塊會被同時消除(例如下面圖5 所示的情形,5 個方塊會同時被消除)。
3 、方塊消除之後,消除位置之上的方塊將掉落,掉落後可能會引起新的方塊消除。註意:掉落的過程中將不會有方塊的消除。
上面圖1 到圖 3 給出了在棋盤上移動一塊方塊之後棋盤的變化。棋盤的左下角方塊的坐標為(0, 0 ),將位於(3, 3 )的方塊向左移動之後,遊戲界面從圖 1 變成圖 2 所示的狀態,此時在一豎列上有連續三塊顏色為4 的方塊,滿足消除條件,消除連續3 塊顏色為4 的方塊後,上方的顏色為3 的方塊掉落,形成圖 3 所示的局面。
輸入輸出格式
輸入格式:
輸入文件mayan.in,共 6 行。
第一行為一個正整數n ,表示要求遊戲通關的步數。
接下來的5 行,描述 7*5 的遊戲界面。每行若幹個整數,每兩個整數之間用一個空格隔開,每行以一個0 結束,自下向上表示每豎列方塊的顏色編號(顏色不多於10種,從1 開始順序編號,相同數字表示相同顏色)。
輸入數據保證初始棋盤中沒有可以消除的方塊。
輸出格式:
輸出文件名為mayan.out。
如果有解決方案,輸出 n 行,每行包含 3 個整數x,y,g ,表示一次移動,每兩個整數之間用一個空格隔開,其中(x ,y)表示要移動的方塊的坐標,g 表示移動的方向,1 表示向右移動,-1表示向左移動。註意:多組解時,按照 x 為第一關健字,y 為第二關健字,1優先於-1 ,給出一組字典序最小的解。遊戲界面左下角的坐標為(0 ,0 )。
如果沒有解決方案,輸出一行,包含一個整數-1。
輸入輸出樣例
輸入樣例#1:3 1 0 2 1 0 2 3 4 0 3 1 0 2 4 3 4 0輸出樣例#1:
2 1 1 3 1 1 3 0 1
說明
【輸入輸出樣例說明】
按箭頭方向的順序分別為圖6 到圖11
樣例輸入的遊戲局面如上面第一個圖片所示,依次移動的三步是:(2 ,1 )處的方格向右移動,(3,1 )處的方格向右移動,(3 ,0)處的方格向右移動,最後可以將棋盤上所有方塊消除。
【數據範圍】
對於30% 的數據,初始棋盤上的方塊都在棋盤的最下面一行;
對於100%的數據,0 < n≤5 。
noip2011提高組day1第3題
/* 需要模擬的操作:交換,消除,下落 按照出入數據的格式,交換可以看做是和一個數上面的數或下面的數交換 交換是有一定條件的: 和下面的數交換,需要保證交換的兩個數不相等,下面的位置不超過邊界 和上面的數交換,需要保證上面一行為空(不然與上一步重復,無意義),上面的位置不超過邊界 */ #include<iostream> #include<cstdio> #include<cstdlib> using namespace std; int n,a[10][10],b[10][10],ans[6][5]; bool judge(){ for(int i=1;i<=5;i++)if(a[i][1]!=0)return 0; return 1; } void down(){ for(int i=1;i<=5;i++)for(int j=1;j<=7;j++){ int x=i,y=j; while(a[x][y]&&a[x][y-1]==0&&y-1>=1) swap(a[x][y],a[x][y-1]),y--; } } void remove(){ down();bool flag=0; for(int i=1;i<=5;i++)for(int j=1;j<=7;j++)b[i][j]=a[i][j]; for(int i=1;i<=5;i++)for(int j=1;j<=7;j++){ if(b[i][j]==0)break; if(b[i][j]==b[i-1][j]&&b[i][j]==b[i+1][j]) flag=1,a[i][j]=a[i-1][j]=a[i+1][j]=0; if(b[i][j]==b[i][j-1]&&b[i][j]==b[i][j+1]) flag=1,a[i][j]=a[i][j-1]=a[i][j+1]=0; } if(flag)down(),remove(); } void dfs(int step){ if(step==n+1){ if(judge()){ for(int i=1;i<=n;i++)printf("%d %d %d\n",ans[i][1]-1,ans[i][2]-1,ans[i][3]); exit(0); } return ; } int c[10][10]; for(int i=1;i<=5;i++)for(int j=1;j<=7;j++){ if(a[i][j]==0)break; for(int k=1;k<=5;k++)for(int l=1;l<=7;l++)c[k][l]=a[k][l]; if(!(a[i][j]==a[i+1][j]||i+1>5)){ swap(a[i][j],a[i+1][j]); remove(); ans[step][1]=i;ans[step][2]=j;ans[step][3]=1; dfs(step+1); for(int k=1;k<=5;k++)for(int l=1;l<=7;l++)a[k][l]=c[k][l]; } if(!(a[i-1][j]!=0||i-1<1)){ swap(a[i][j],a[i-1][j]); remove(); ans[step][1]=i;ans[step][2]=j;ans[step][3]=-1; dfs(step+1); for(int k=1;k<=5;k++)for(int l=1;l<=7;l++)a[k][l]=c[k][l]; } } } int main(){ freopen("Cola.txt","r",stdin); scanf("%d",&n); int x; for(int i=1;i<=5;i++) while(1){ scanf("%d",&x); if(x==0)break; a[i][++a[i][0]]=x; } dfs(1); puts("-1"); return 0; }
洛谷P1312 Mayan遊戲