HDU 1010 比較坑人的一道搜尋題

2021-07-10 13:02:09 字數 1206 閱讀 9732

本人當初只是想到用搜尋做,上手就是bfs結果wa了,後來反應過來只能用dfs來做

提交了21次,全tle,後來在多次努力下找到了大量的陷阱,為還在為此題困擾的人指指路

1.奇偶剪枝

很簡單的乙個概念

設起點座標是bx,by;終點座標是ex,ey;

最短路徑是abs(bx-ex)+abs(by-ey)

但是我們可以很顯然的看出來,無論是走,我們的步數肯定比最短路徑數多乙個偶數

所以,簡化的第一點來了:如果題目中輸入的步數比最短路徑數多得是乙個奇數,那麼我們永遠也不可能走到,所以直接輸出no;

2.路徑剪枝

在dfs當前的過程的路數中一旦大於等於要求的步數並且還沒有找到終點,直接輸出no

3.最讓人後怕的一點

我從自學dfs以來一直沒有注意到有一點非常的害怕,dfs是用遞迴實現的,那麼如果我們找到了終點並且路數也符合,不能只是讓指示變數變值那麼簡單

我們要在每次遞迴返回後面再加上乙個判斷,目的是終止查詢,如果不這樣做,就算找到了結果是yes我們也必須等到整個圖全部被掃瞄完才可以結束程式

自然而然就會tle了

附上ac**

#include"iostream"

#include"cstdio"

#include"cstring"

using namespace std;

char map[10][10];

int book[10][10];

int n,m,t;

int flag=0;

int nextk[4][2]=,,,};

int bx,by;

int ex,ey; 

int w;

void dfs(int x,int y,int len)

if(len>=t)                                 //路徑剪枝

else

else

book[dx][dy]=0;}}

}}}int main()

else

if(map[i][j]=='d')}}

w=abs(ex-bx)+abs(ey-by);

if((t-w)%2==1);                            //奇偶剪枝

else

if(flag==1)

else }

}return 0;

一道比較經典的迷宮問題

現在有乙個城市銷售經理,需要從公司出發,去拜訪市內的商家,已知他的位置以及商家的位置,但是由於城市道路交通的原因,他只能在左右中選擇乙個方向,在上下中選擇乙個方向,現在問他有多少種方案到達商家位址。給定乙個地圖map及它的長寬n和m,其中1代表經理位置,2代表商家位置,1代表不能經過的地區,0代表可...

一道bfs廣搜的ACM競賽入門題

農夫知道一頭牛的位置,想要抓住它。農夫和牛都於數軸上 農夫起始位於點 n 0 n 100000 牛位於點 k 0 k 100000 農夫有兩種移動方式 1 從 x移動到 x 1或x 1 每次移動花費一分鐘 2 從 x移動到 2 x 每次移動花費一分鐘 假設牛沒有意識到農夫的行動,站在原地不動。最少要...

HDU 3555 我的第一道數字DP

題意就是找0到n有多少個數中含有49。資料範圍接近10 20 dp的狀態是2維的dp len 3 dp len 0 代表長度為len不含49的方案數 dp len 1 代表長度為len不含49但是以9開頭的數字的方案數 dp len 2 代表長度為len含有49的方案數 狀態轉移如下 dp i 0 ...