題目意思很明顯,有很多種情況,找到最的方法,也就是最短路。
看了各種大佬題解,有dfs,bfs搜尋做法,floyd,djkstra最短路做法,%%%,這裡就只寫蒟蒻的深搜做法。。。
1.mle,m8個點死迴圈空間棧超限;沒有對走過的點標記,導致還能走回去死迴圈
1 #include 2 #include3 #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 #include3 #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 #include3 #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 #include3 #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 #include3 #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 觀察例子發現,每一層到達的樓層是確定的,如果將樓層模擬成頂點,相互間存在到達關係的表示有通路,因此可以將上述問題求解過程,轉變為求頂...