P1354 房間最短路問題

2022-06-04 10:39:12 字數 1607 閱讀 9931

​ 看到此題,第乙個想到的是貪心:要從(0.0,5.0)走到(10.0,5.0),就要繞過一些牆,那就會經過一些牆的端點(下文稱之為節點),單從樣例看來,就會說走到離當前節點距離最小的點就行了,但真的是這樣嗎?

​ 顯然不是,原因有二:

如果起點到終點沒有障礙,那麼走其它節點是不是就會走了冗餘的路?是的,在某些最優方案中,確實會出現從間隙中穿過的情況.

即使沒有出現上述情況,試觀察下圖,貪心的路徑為紅色,正解為藍色.

​ 既然資料範圍\(n\le20\),那麼考慮暴力如何?

​ 於是很快想到了暴力流程:

從起點(0.0,5.0)出發並作為當前節點;

對於當前節點u,遍歷下乙個要到達的節點v,判斷它能否到達

如果能夠到達,那麼跳到v,將v作為u進行下一輪dfs.

如果不能到達,考慮下乙個點.

如果遇到終點則記錄路徑然後回溯重複上一步驟.

明確了思路後,就開始編**吧.

暴力**段打出來如下:

(為了突出被執行語段,注釋與背景主題近色,如需檢視,請選中語段或者放入ide)

double dis(double x1,double y1,double x2,double y2)

bool check(int u,int v,double x1,double y1,double x2,double y2)

bool check(int u,int v,double x1,double y1,double x2,double y2)

/* for(int i=1;i<=n;i++)

*/// cout作為暴力,還是超時了,能拿到80分(還是不錯了),

​ 這時候就要用上暴力的救星——記憶化了,令\(f_\)表示到達第i堵牆的第j個節點所用的最小距離,那麼只要當前路徑超過這個值自然是走不下去的了,將其放進**中優化一下就ac了:

ac

洛谷P1354 房間最短路問題 floyd

在乙個長寬均為10,入口出口分別為 0,5 10,5 的房間裡,有幾堵牆,每堵牆上有兩個缺口,求入口到出口的最短路經。輸入格式 第一排為n n 20 牆的數目。接下來n排,每排5個實數x,a1,b1,a2,b2。x表示牆的橫座標 所有牆都是豎直的 a1 b1和a2 b2之間為空缺。a1 b1 a2 ...

luogu P1354 房間最短路問題

火焰之地傳送門 憑心而論這題挺水的,一道計算幾何加工的最短路。用前面牆的個數 4 當前牆上的序號表示點的序號,對於每個點 包括起點和終點 列舉其後面牆上的所有點一一判斷是否可與之相連,能相連就連邊,最後跑一遍floyd。判斷直接用數學公式做一次函式就行。呆馬 include include incl...

Luogu P1354 房間最短路問題

這是一道紫題,然而實際上我覺得也就藍題難度甚至不到。and,這道題就是一道數學題,模擬計算過程。求最短路嘛,肯定要考慮建圖,只需要把中間的牆上每個口的邊緣處的點作為圖中的點就行。至於為什麼,顯然如果我們取中間任何乙個點連邊,到下一面牆時路徑之和總是比連其中乙個邊緣的點要大,直觀感 g n覺 ju 一...