P1312 Mayan遊戲 深搜 模擬

2022-05-16 02:16:33 字數 2608 閱讀 8918

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 所示的局面。

共 6 行。

第一行為乙個正整數n,表示要求遊戲通關的步數。

接下來的5行,描述 7×5 的遊戲介面。每行若干個整數,每兩個整數之間用乙個空格隔開,每行以乙個0 結束,自下向上表示每豎列方塊的顏色編號(顏色不多於10種,從1開始順序編號,相同數字表示相同顏色)。

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

輸出格式

如果有解決方案,輸出n行,每行包含 3 個整數x,y,g,表示一次移動,每兩個整數之間用乙個空格隔開,其中(x ,y)(x,y)表示要移動的方塊的座標,g 表示移動的方向,1 表示向右移動,-1表示向左移動。注意:多組解時,按照x為第一關健字,y為第二關健字,1 優先於−1 ,給出一組字典序最小的解。遊戲介面左下角的座標為(0 ,0)(0,0)。

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

搜尋+模擬。把各種操作寫成乙個個函式,簡化**。

陣列說明:

m[i][j]---存圖

cm[k][i][j]---存下搜尋到cnt=k時的圖,方便回溯

remove中的era[i][j]:若era[i][j] == 1,則m[i][j]可以消除。

函式:remove:消除可以消除的方塊

update:該落的方塊落下來

move:交換兩個方塊,並完成接下來會發生的一切變化。

搜尋:要求字典序最小,1比-1優。我們考慮「左邊的方塊往右移」和「右邊的方塊往左移」時等效的。所以我們不需要考慮往左移。但要加乙個判斷:如果移動的格仔沒有方塊,那麼這個格仔往右移在實際意義上說不通,所以這事要特判記錄成「右邊的方塊往左移」。

具體看**。

#includeusing namespace std;

int m[10][10],n,cm[10][10][10],finished = 0,tot[10][3],num = -1;

void update()

} }}bool remove(),flag = 0;

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

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

if(m[i][j] == m[i + 1][j] && m[i - 1][j] == m[i][j] && i != 0 && i != 4)

} if(!flag) return 0;

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

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

} return flag;

}void move(int x,int y)

bool is_finished()

void copy(int k)

void paste(int k)

void dfs(int cnt)

if(cnt == n) return;

copy(cnt);

if(is_finished())

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

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

else

move(i,j);

dfs(cnt + 1);

if(finished) return;

paste(cnt);

}}int main()

} dfs(0);

if(num == -1) cout << -1;

return 0;

}

洛谷P1312 Mayan遊戲(深搜)

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

洛谷P1312 Mayan遊戲

題目描述 見鏈結 解析 直接模擬和搜尋即可,注意儲存好資料,防止回溯時丟失。mayan遊戲 乙個模擬程度大於搜尋的搜尋題 大體模擬過程 移動 下降 消除 repeat 到達規定步數判斷是否消除完 具體剪枝方案luogu上的其他題解都說的比較清楚了。不過根據本 注釋也許可以更好理解一些 注意 此 中行...

洛谷P1312 Mayan遊戲

題目 搜尋 剪枝 對於每個操作都只需要模擬就可輕鬆得出每一步操作的 這個題需要考慮回溯操作,由於搜尋是在一棵搜尋樹中,因此我們可以記錄每乙個深度的回溯狀態,僅僅用乙個陣列會出現狀態轉移失誤的情況,所以需要用多個陣列。然後考慮剪枝,如果交換不交換沒有區別,則不需要交換,而且i向左交換等同於i 1向右交...