洛谷P1135奇怪的電梯(正向暴力遞迴 剪枝優化)

2022-06-24 15:18:09 字數 3704 閱讀 3199

題目意思很明顯,有很多種情況,找到最的方法,也就是最短路。

看了各種大佬題解,有dfs,bfs搜尋做法,floyd,djkstra最短路做法,%%%,這裡就只寫蒟蒻的深搜做法。。。

1.mle,m8個點死迴圈空間棧超限;沒有對走過的點標記,導致還能走回去死迴圈

1 #include 2 #include 

3 #include 4 #include 5 #include 6 #include 7 #include 8

using

namespace

std;

9 typedef long

long

ll;10 typedef unsigned long

long

ull;

11const

int maxn=1005;12

inta[maxn];

13int

vis[maxn][maxn];

14int

n,a,b;

15int ans=1e9;

16int p=1;17

18void so(int last,int

step)

1927

28int s=last+a[last],x=last-a[last];

29if(s<=n) so(s,step+1

);30

if(x>=1) so(x,step+1

);31}32

33int

main()

34

2.tle,標記了但t2個點可以走的路數太多,一條一條走時間太多;

幾乎每條路都是通的,這樣更新回來還要重走!

我試了下最後2點資料,真是跑了好長好長時間才出來答案。。。

這就對dfs深搜很不利了,這種情況可以考慮剪枝或記憶化(哪個行得通就用哪個,一般剪枝好想把不合題目要求的刪掉就行,記憶化不太好想)

1 #include 2 #include 

3 #include 4 #include 5 #include 6 #include 7 #include 8

using

namespace

std;

9 typedef long

long

ll;10 typedef unsigned long

long

ull;

11const

int maxn=1e6+5;12

inta[maxn];

13int

vis[maxn];

14int

n,a,b;

15int ans=1e9;

16int p=1;17

18void so(int last,int

step)

1926

27int s=last+a[last],x=last-a[last];

28if(s<=n) }

29if(x>=1) }30}

3132

intmain()

33

3.優化剪枝50ms過

1 #include 2 #include 

3 #include 4 #include 5 #include 6 #include 7 #include 8

using

namespace

std;

9 typedef long

long

ll;10 typedef unsigned long

long

ull;

11const

int maxn=1e6+5;12

inta[maxn];

13int

vis[maxn];

14int

n,a,b;

15int ans=1e9;

16int p=1;17

18void so(int last,int

step)

1928

29int s=last+a[last],x=last-a[last];//

step<=ans就是剪枝優化...

30if(s<=n && vis[s]==0 && step<=ans)

31if(x>=1 && vis[x]==0 && step<=ans) 32}

3334

intmain()

35

4.附帶bfs版本27ms過,bfs和dfs遍歷搜尋所有情況的那種思路是一樣的,只不過是以廣度優先

1 #include 2 #include 

3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9

using

namespace

std;

10 typedef long

long

ll;11 typedef unsigned long

long

ull;

12const

int maxn=1e6+5;13

inta[maxn];

14int

vis[maxn];

15int dis[maxn];//

bfs,dis陣列有記錄距離和標記作用!可以代替vis陣列

16int

n,a,b;

17 queueque;

1819

void bfs(int

sx)20

35if(x>=1 && dis[x]==-1)36

40}41}

4243

intmain()

44

加乙個記憶化遞迴版本(額。。不知道哪有問題,只有90分,最後乙個毒點wa)

1 #include 2 #include 

3 #include 4 #include 5 #include 6 #include 7 #include 8

using

namespace

std;

9 typedef long

long

ll;10 typedef unsigned long

long

ull;

11const

int maxn=1e6+5;12

inta[maxn];

13int

vis[maxn];

14int

ans[maxn];

15int

n,a,b;

16int p=1;17

18int so(int

last)

1926

27int s=last+a[last],x=last-a[last];

28int a1=1e7,a2=1e7,ans=1e7;

29if(s<=n && vis[s]==0)

30if(x>=1 && vis[x]==0)

3132 ans=min(ans,a1);

33 ans=min(ans,a2);

3435 ans[last]=min(ans[last],ans);

36return

ans[last];

3738}39

40int

main()

41

完。

洛谷p1135 奇怪的電梯

題目描述 呵呵,有一天我做了乙個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第i層樓 1 i n 上有乙個數字ki 0 ki n 電梯只有四個按鈕 開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按鈕就會失靈。例如 3 3 1 2 5代表了ki k1...

洛谷P1135 奇怪的電梯

呵呵,有一天我做了乙個夢,夢見了一種很奇怪的電梯。大樓的每一層樓都可以停電梯,而且第iii層樓 1 i n 上有乙個數字ki 0 ki n 電梯只有四個按鈕 開,關,上,下。上下的層數等於當前樓層上的那個數字。當然,如果不能滿足要求,相應的按鈕就會失靈。例如 3,3,1,2,5代表了ki k1 3,...

洛谷 奇怪的電梯(P1135)

奇怪的電梯 問題分析 根據問題描述,所處在的樓層,上或下的層數由給定數值確定。但是超出範圍則不予響應。舉個例子,如下表所示。樓層號123 456指定數值33 1251 觀察例子發現,每一層到達的樓層是確定的,如果將樓層模擬成頂點,相互間存在到達關係的表示有通路,因此可以將上述問題求解過程,轉變為求頂...