洛谷 1312 Mayan遊戲(dfs)

2021-09-02 15:02:33 字數 1457 閱讀 4177

在乙個7行5列的期盤中,有至多10種顏色的方塊。當這些方塊下方空的時候,這些方塊總是會垂直掉落#### 當有3個顏色相同的方塊排成一行或一列時,它們會被同時消除

你需要在給定的步數內,通過調換相鄰方塊,使棋盤上沒有方塊。

若做不到,輸出-1;不然輸出1種方法(要移動的方塊的x、y座標 + 移動方向) (移動方向 1 = 右移,-1 = 左移)

【注】當有多組解時,以x為第1關鍵字,以y為第2關鍵字,且1優於-1。故輸出是唯一的

【注】棋盤讀入格式:共有5行,每行以0結尾,代表從左至右每列上從下到上的方塊顏色,每行至多8個數還是比較常規的dfs題

按照題意來,每次dfs列舉要移動的方塊時,以x為第1關鍵字,以y為第2關鍵字

右移條件:首先選定的格仔要有方塊;其次右邊有格仔,且要交換的兩個方塊顏色不同

左移條件:首先選定的格仔要有方塊;其次左邊有格仔,且左邊沒有方格(不然還不如右移)

移完判斷清除和掉落,若步數大於n或當前有任意顏色的棋子只有1、2個,則return

若條件符合,直接輸出

class裡面把『n』達成『n』

#include

#include

#include

#define n 7

#define m 5

using

namespace std;

void

swap

(int

&a,int

&b)int n, x[11]

, y[11]

, p[11]

;class

class_table

bool

clear()

}for

(int i =

1; i <= n; i++)}

return res;

}void

drop()

for(

int i =

1; i <= cnt; i++

) table[i]

[j]= tmp[i]

;for

(int i = cnt +

1; i <= n; i++

) table[i]

[j]=0;

}}void

swap

(int x1,

int y1,

int x2,

int y2)

bool

invalid()

bool

finished()

} now;

void

print

(int dep)

void

dfs(

int dep)

if(j >1&&

!temp.table[i]

[j -1]

)}}}

}int

main()

NOIP2011 洛谷1312 Mayan遊戲

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

洛谷P1312 Mayan遊戲

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

洛谷P1312 Mayan遊戲

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