題目就不粘了,題意是這樣的:乙個帶網格的方格板,有兩種方格,一種是白色的,一種是網狀的。白色表示可以通過,用數字0表示,網狀的表示障礙物不能通過,用數字1表示。起點和終點分別在兩個白色的上面,分別用數字2、3表示。
目標就是從起點走到終點,且步數小於等於10。
走法和步數計算比較特殊:選定乙個方向後,只要是通的就能走下去,三種情況:1、剛好走到終點;2、下一步是障礙物,沒法走了,就停下來了,注意,碰到障礙物雖然會停下來了,但是障礙物也跟著沒了,這也是不能用bfs的原因,圖的結構會發生變化;3、到板子邊界了,既沒到終點也沒障礙物擋著,就出了板子,也就失敗了。這樣三種情況下,都算作一步,即選定乙個方向後到停下來就算做一步。
這樣看的話用「滾」代替「走」比較好理解,題目也是用的石頭為物件進行的。
有一些易錯點:
1、題意沒理解清;
2、方格板橫豎搞錯了,我原來習慣用x、y標記,然後就亂了,就按照題目給的w、h標記了;
3、三種情況的判定容易亂,要注意位置標記;
4、把位置座標帶入陣列的時候,要考慮越界的問題,當然這個編譯就沒過 了。
貼**:
#include #include using namespace std;
int map[30][30],w,h,sw,sh,gw,gh,minstep;
int dir[4][2] = ,,,};
int notover(int ch,int cw)
int notacc(int ch,int cw)
void dfs(int ch,int cw,int step)
if(tmph == gh && tmpw == gw)
if(!notover(tmph,tmpw))
continue;
nh = tmph - dir[i][0];
nw = tmpw - dir[i][1];
if(nh == gh && nw == gw)
if(notacc(tmph,tmpw) == 1)
if(notacc(tmph,tmpw) == 2)
}return;
}int main()
if(map[i][j] == 3)
}dfs(sh,sw,0);
if(minstep > 10)
cout<<"-1"<
poj 3009 深搜求最短路
題目大意就是求在特定規則下的最短路,這個規則包含了消除障礙的操作。用bfs感覺選擇消除障礙的時候不同路徑會有影響,用dfs比較方便狀態的還原 雖然效率比較低 因此這道題目採用dfs來寫。寫的第一次提交 是tle,原因是忘記總步數 10就應該剪枝的條件。ac 如下 1 include 2 includ...
POJ 3009 簡單的dfs回溯遍歷搜尋)
注意行 與 列 的輸入時反過來的 然後就是障礙物被撞後會消失 但當回來時要恢復被撞的障礙物。只用了乙個簡單的剪枝 當區域性最優值大於當前最優值則剪枝 include include include include include include include include include inc...
poj 1321 棋盤問題 暴力DFS
棋盤問題 time limit memory limit total submissions accepted description 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋...