poj 3009 dfs暴力解決最短路

2021-06-28 15:09:11 字數 1146 閱讀 3463

題目就不粘了,題意是這樣的:乙個帶網格的方格板,有兩種方格,一種是白色的,一種是網狀的。白色表示可以通過,用數字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 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋...