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。
31 02 1 0
2 3 4 0
3 1 0
2 4 3 4 0
2 1 1按箭頭方向的順序分別為圖6 到圖113 1 1
3 0 1
樣例輸入的遊戲局面如上面第乙個所示,依次移動的三步是:(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...