noip2011 Mayan遊戲 dfs 模擬

2021-07-24 05:58:57 字數 1273 閱讀 5978

**能力太弱啊,調了一天。首先我bfs掛了,因為狀態太多而mle,好像只能dfs,然後bfs改dfs過程中傻x錯誤一大堆。這道題主要是模擬比較麻煩,消除塊的情況非常複雜。剪枝的話,如果乙個塊左邊有塊,就不用搜它向左移的情況,因為左邊的塊向右移會更優。剪這乙個應該就可以。還有總結這幾天做題經驗,一定謹慎使用stl,刪塊的時候把要刪的座標加入佇列最後一起刪,結果用了8s,記錄了一下刪塊,結果不到1s。開始沒有意識到這個問題,一天就這樣過去了。%%%當場a掉的大神。最後希望大家打**要有耐心,調個大爆搜還是挺漲姿勢的。

#include

#include

#include

#include

#include

using

namespace

std;

int n;

struct m

return h;

}void ans()

void print()

}bool fall()

swap(mp[i][j],mp[x][j]);

}return h;

}void del()}}

for(int x=3;x<=4;x++)}}

else

break;}}

else

if(p&&p==mp[j+1][i]&&p==mp[j+2][i])}}

for(int x=3;x<=4;x++)}}

else

break;}}

}if(fall())

del();

}};m a;int ans;

void dfs(int x)

if(p==2) return;

if(x==n)return;

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

for(int j=7;j>=1;j--)

if(i>1&&!a.mp[j][i-1])

}}int main()

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

a.mp[8][i]=23+i;

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

a.mp[i][6]=233+i;

dfs(0);

if(!ans) puts("-1");

return

0;}

從昨天下午就開始做這道題,晚上還是沒有做出來,gg,心情很不爽,去樓下物理搞事情,簡直interesting。其實乙個人或一群人全身心投入去鑽研乙個東西,真的是很愉♂快的(羨慕隔壁物理的老司機們)。

NOIP2011 Mayan遊戲 搜尋

第一反應是搜尋題,想了一下如果用bfs的話,由於狀態過多,可能超記憶體,因此我用的dfs。這裡我們討論一下剪枝條件 如果當前狀態有一種顏色的數量小於3,那麼這種顏色就無法被消除,因此我們可以提前退出迭代。如果兩個連著的方塊顏色是相同的話,我們不用交換。如果兩個非空的方塊交換,我們只用考慮左邊那個方塊...

NOIP2011 Mayan遊戲 題解

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

NOIP2011 Mayan遊戲 搜尋

乙個有效的剪枝是排除等效冗沉,當兩種操作形成等效效果時不重複搜尋 若有兩個塊,那麼左邊的右移和右邊的左移是等效的,由於題意認為右移優先於左移,所以這種情況只取右移,而乙個塊左邊是空的時候則要嘗試左移 在回溯法 還原 的時候,可以先複製出來局面,在函式裡開陣列 別用全域性的,要儲存多個局面 然後複製回...