NOIP瑪雅遊戲

2021-08-04 11:21:39 字數 3295 閱讀 4929

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 開始順序編號,相同數字表示相同顏色)。

輸入資料保證初始棋盤中沒有可以消除的方塊。

如果有解決方案,輸出n 行,每行包含3 個整數x,y,g,表示一次移動,每兩個整數之間用乙個空格隔開,其中(x,y)表示要移動的方塊的座標,g 表示移動的方向,1 表示向右移動,-1 表示向左移動。

注意:多組解時,

按照x 為第一關健字,y 為第二關健字,1優先於-1,給出一組字典序最小的解。遊戲介面左下角的座標為(0,0)。

如果沒有解決方案,輸出一行,包含乙個整數-1。

3

1 02 1 0

2 3 4 0

3 1 0

2 4 3 4 0

2 1 1

3 1 1

3 0 1

按箭頭方向的順序分別為圖6 到圖11

樣例輸入的遊戲局面如上面第乙個所示,依次移動的三步是:(2,1)處的方格向右移動,(3,1)處的方格向右移動,(3,0)處的方格向右移動,最後可以將棋盤上所有方塊消除。

【資料範圍】

對於30%的資料,初始棋盤上的方塊都在棋盤的最下面一行;

對於100%的資料,0 < n≤5。

棋盤很小,直接暴搜肯定是可以的,不過細節還是很多的

考試的時候的確看出來是搜尋,但具體細節太麻煩,時間太短沒調出來,dfs調不出來最後重新寫一遍!!!

按照字典序預處理移動操作(用結構體存),先列舉x,在列舉y,然後是右移,左移;

dfs列舉每一步的操作方案,然後move(),fall(),while(wipe()===1) fall()

move()代表交換兩個位置(執行操作)

fall()代表掃一遍整張圖,使懸空的點下落

wipe()代表掃整張圖,bool標記連續可以消除的塊,掃完整張圖之後,在把標記點賦值為0

move()後要執行一遍fall(),因為交換的位置可能是空塊

每執行一步前,copy存一下當前圖的狀態,方便回溯,如果每一次記錄執行哪一步最後在統一執行,會t掉

優化:如果當前需要移動的點是空並且移動後的位置不為空,那麼直接換成相反的操作

比如當前操作是2 1 1,此時(2,1)為空,把操作換成3 1 -1,這個可以與處理每個操作的相反操作

#include#include#includeusing namespace std;

int n,kk=0;

int a[10][10],f[10];

int cy[10][10];

int ri[10][10],le[10][10],ff[105];

bool vis[10][10];

struct node

b[105],ans[10];

bool op=0,v[105];

inline void read()

if(i!=0)

}

for(int i=0;i<5;i++)

for(int j=0;j<7;j++)

ff[ri[i][j]]=le[i+1][j];

}void move(int u)

else

}void visit(int qx,int qy,int tx,int ty)

bool wipe()

if(js>=3) visit(i,j,kx-1,j);

ky=j;js=0;

while(ky<=6&&cy[i][ky]==cy[i][j])

if(js>=3) visit(i,j,i,ky-1);

}for(int i=0;i<5;i++)

for(int j=0;j<7;j++)

if(vis[i][j]==1)

return opt;

}void fall() }

void dfs(int x)

int now2[10][10]=;

memcpy(now2,cy,sizeof(now2));

for(int i=1;i<=kk;i++)

if(v[i]==0)

move(f[x]);fall();

while(wipe()==1) fall();

dfs(x+1);

v[i]=0;

}}int main()

NOIP2011 瑪雅遊戲

mayan puzzle 是最近流行起來的乙個遊戲。遊戲介面是乙個7 行5 列的棋盤,上面堆放著一些方塊,方塊不能懸空堆放,即方塊必須放在最下面一行,或者放在其他方塊之上。遊戲通關是指在規定的步數內消除所有的方塊,消除方塊的規則如下 1 每步移動可以且僅可以沿橫向 即向左或向右 拖動某一方塊一格 當...

dfs NOIP2011 瑪雅遊戲

檔案太長,傳送門 大爆搜。考試時被卡死了。搜每一種狀態,因為狀態太少,不會爆 要判斷下落,然後能否消,再判斷下落,直到不能再消。include include include include includeusing namespace std int n,ans 10 10 struct node...

noip 轉圈遊戲

題目描述 description n 個小夥伴 編號從 0 到 n 1 圍坐一圈玩遊戲。按照順時針方向給 n 個位置編號,從0 到 n 1。最初,第 0 號小夥伴在第 0 號位置,第 1 號小夥伴在第 1 號位置,依此類推。遊戲規則如下 每一輪第 0 號位置上的小夥伴順時針走到第 m 號位置,第 1...