原題請看這裡。
題目描述非常清晰,在乙個迷宮裡從一點到另一點,限制條件是至多拐k次彎。
如果不加限制條件,只需要bfs或者dfs從起始點開始遍歷即可,每個點只遍歷一次,時間複雜度o(m*n)。
加上限制條件之後,與之前只要求到達這一點不同,由於到乙個點有很多種走法,到這一點已經拐彎的次數也會不同,所以一次遍歷不能解決問題。那麼就應該把所有的走法都嘗試一遍,看能否在k次拐彎之內,到達目標點。觀察資料範圍發現,1 ≤ m, n ≤ 100,完全嘗試一遍時間複雜度無法忍受。注意到如果有一條到某點的路徑,使得到該點拐彎次數最少,則通過該路徑到路徑上其他點的拐彎數也為最少,滿足最優子結構,故可以考慮動態規劃。
理論上來說,應該採用bfs+dp的方法,因為按照bfs的順序,才能按照dp方程遞推地完成最少拐彎數的求解。實際上,為了實現方便,我採用dfs+dp的方法,在dfs時,dp可以提供強有力的剪枝,使得問題在有效時間內解決。
實現注意:
#include#includeconst int dx= ,dy= ;
int t,n,m,k,sx,sy,tx,ty,map[120][120],turn[120][120];
void dfs(int x, int y, int dir)
}}int main()
scanf("%d%d%d%d%d",&k,&sy,&sx,&ty,&tx);
turn[sx][sy]=0;
dfs(sx,sy,0);
if (turn[tx][ty]<=k) printf("yes\n");
else printf("no\n");
}return 0;
}
hdu 1728 逃離迷宮
思路 一開始我是往左和往右走,不轉彎,計數不用加,往上和往下走,就轉彎,計數就加一,進行廣搜,搜到最後那個點,比較就可以啦,但是華麗麗的wa啦。所以改一條路搜到底,走不了啦,就一定要轉彎啦。include include include includeusing namespace std stru...
HDU 1728 逃離迷宮
bfs 搞清楚是轉彎而不是步數。所以需要乙個方向一直走下去直到邊界或者牆。還有就是注意題意。給出起點終點的 x,y 位置是交換的。題目是下標1開始。注意。include include include include include include include include include i...
HDU 1728 逃離迷宮
逃離迷宮 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 給定乙個m n m行,n列 的迷宮,迷宮中有兩個位置,gloria想從迷宮的乙個位置走到另外乙個位置,當然迷宮中...