在乙個長寬均為10,入口出口分別為(0,5)、(10,5)的房間裡,有幾堵牆,每堵牆上有兩個缺口,求入口到出口的最短路經。
輸入格式:
第一排為n(n<=20),牆的數目。
接下來n排,每排5個實數x,a1,b1,a2,b2。
x表示牆的橫座標(所有牆都是豎直的),a1-b1和a2-b2之間為空缺。
a1、b1、a2、b2保持遞增,x1-xn也是遞增的。
輸出格式:
輸出最短距離,保留2位小數。
輸入樣例
2
4 2 7 8 9
7 3 4.5 6 7
輸出樣例
10.06
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
struct wall
w[22];
int n;
double e[101][101];
bool hathes(int a,int b,int w1,int w2)
return1;}
void addedge(int a,int b,int w1,int w2)
int main()
w[0].x=0;w[++n].x=10;
for (int i=1;i<5;i++) w[0].z[i]=w[n].z[i]=5;//初始化起點與終點
for (int i=0;ifor (int j=i+1;j<=n;j++) for (int k=1;k<5;k++) for (int l=1;l<5;l++) addedge(i,j,k,l);//迴圈建邊
for (int i=0;i<101;i++) e[i][i]=0;
for (int k=1;k<=n*4+4;k++)
for (int i=1;i<=n*4+4;i++)
for (int j=1;j<=n*4+4;j++)
e[i][j]=min(e[i][j],e[i][k]+e[k][j]);//floyd
printf("%.2f\n",e[1][n*4+1]);
return
0;}
P1354 房間最短路問題
看到此題,第乙個想到的是貪心 要從 0.0,5.0 走到 10.0,5.0 就要繞過一些牆,那就會經過一些牆的端點 下文稱之為節點 單從樣例看來,就會說走到離當前節點距離最小的點就行了,但真的是這樣嗎?顯然不是,原因有二 如果起點到終點沒有障礙,那麼走其它節點是不是就會走了冗餘的路?是的,在某些最優...
luogu P1354 房間最短路問題
火焰之地傳送門 憑心而論這題挺水的,一道計算幾何加工的最短路。用前面牆的個數 4 當前牆上的序號表示點的序號,對於每個點 包括起點和終點 列舉其後面牆上的所有點一一判斷是否可與之相連,能相連就連邊,最後跑一遍floyd。判斷直接用數學公式做一次函式就行。呆馬 include include incl...
Luogu P1354 房間最短路問題
這是一道紫題,然而實際上我覺得也就藍題難度甚至不到。and,這道題就是一道數學題,模擬計算過程。求最短路嘛,肯定要考慮建圖,只需要把中間的牆上每個口的邊緣處的點作為圖中的點就行。至於為什麼,顯然如果我們取中間任何乙個點連邊,到下一面牆時路徑之和總是比連其中乙個邊緣的點要大,直觀感 g n覺 ju 一...