**能力太弱啊,調了一天。首先我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遊戲 搜尋
乙個有效的剪枝是排除等效冗沉,當兩種操作形成等效效果時不重複搜尋 若有兩個塊,那麼左邊的右移和右邊的左移是等效的,由於題意認為右移優先於左移,所以這種情況只取右移,而乙個塊左邊是空的時候則要嘗試左移 在回溯法 還原 的時候,可以先複製出來局面,在函式裡開陣列 別用全域性的,要儲存多個局面 然後複製回...