題目
搜尋+剪枝
對於每個操作都只需要模擬就可輕鬆得出每一步操作的**。
這個題需要考慮回溯操作,由於搜尋是在一棵搜尋樹中,因此我們可以記錄每乙個深度的回溯狀態,僅僅用乙個陣列會出現狀態轉移失誤的情況,所以需要用多個陣列。然後考慮剪枝,如果交換不交換沒有區別,則不需要交換,而且i向左交換等同於i-1向右交換,判斷一下是否有有漏解就可以無重複的列舉了。
#include #include using namespace std;
struct dat
ans[10001];
int n, now, flag;
int b[7][9], a[7][9];
int v[7][9][10];// v是每一列從下到上的數排列起來,需要多加一位從而方便回溯,dp和搜尋在無法再找到解題方式的時候,增加一維狀態往往是一種好方法。
void cv (int now)//now是當前處於第幾步 *之後*
void print()
void down()//使當前所有浮在空中的方塊下落。 }}
bool lose()
if (!flag) return 0;
for (int i = 1; i <= 5; i++)
for (int j = 1; j <= 7; j++)
// print();
return 1;
}void move(int i, int j, int g)
bool check()//判斷當前是否所有數都被刪除了。
void dfs(int now)
if (now == n + 1) return;
cv(now);//將當前的狀態記錄下來。
for (int i = 1; i <= 5; i++)
for (int j = 1; j <= 7; j++)
if (i - 1 >= 1 && a[i - 1][j] == 0)
}}int main()
dfs(1);
printf("-1");
return 0;}/*
31 0
2 1 0
2 1 4 0
2 4 0
4 0*/
洛谷P1312 Mayan遊戲
題目描述 見鏈結 解析 直接模擬和搜尋即可,注意儲存好資料,防止回溯時丟失。mayan遊戲 乙個模擬程度大於搜尋的搜尋題 大體模擬過程 移動 下降 消除 repeat 到達規定步數判斷是否消除完 具體剪枝方案luogu上的其他題解都說的比較清楚了。不過根據本 注釋也許可以更好理解一些 注意 此 中行...
洛谷P1312 Mayan遊戲(深搜)
mayan puzzle是最近流行起來的乙個遊戲。遊戲介面是乙個 7 行5 列的棋盤,上面堆放著一些方塊,方塊不能懸空堆放,即方塊必須放在最下面一行,或者放在其他方塊之上。遊戲通關是指在規定的步數內消除所有的方塊,消除方塊的規則如下 1 每步移動可以且僅可以沿橫向 即向左或向右 拖動某一方塊一格 當...
再做一遍 洛谷 P1312Mayan遊戲
mayan puzzle是最近流行起來的乙個遊戲。遊戲介面是乙個 7 行5 列的棋盤,上面堆放著一些方塊,方塊不能懸空堆放,即方塊必須放在最下面一行,或者放在其他方塊之上。遊戲通關是指在規定的步數內消除所有的方塊,消除方塊的規則如下 1 每步移動可以且僅可以沿橫向 即向左或向右 拖動某一方塊一格 當...