洛谷P1135 奇怪的電梯 BFS例題
阿新 • • 發佈:2018-06-01
std tail ring lose 很多 循環 lap 分享圖片 PE
好,這是一道黃題。幾個月前(2017.10.29)的我拿了可憐的20分。
這是當年的蒟蒻代碼
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <algorithm> 5 #include <cstdlib> 6 using namespace std; 7 8 int n,b,c; 9 int a[201]; 10 11 int xiuxi(int now,int k) 12 { 13 if(k>200) return蒟蒻代碼-1; 14 int aa=9999,bb=9999; 15 if(now == c) return k; 16 17 if(now+a[now]<=n) 18 { 19 aa=xiuxi(now+a[now],k+1); 20 } 21 if(now-a[now]>0) 22 { 23 bb=xiuxi(now-a[now],k+1); 24 } 25 ///return ???; 26 } 27 28 int main() 29 { 30 scanf ("%d%d%d",&n,&b,&c);31 for(int i=1;i<=n;i++) 32 { 33 scanf ("%d",&a[i]); 34 } 35 36 int ans=xiuxi(b,0); 37 printf("%d",ans); 38 return 0; 39 }
首先,頭文件瞎加#(滑稽),然後,搜索的時候沒有處理好無限循環,只能靠200那個上限來return,導致了TLE。xiuxi函數寫的一塌糊塗。也沒有確定是最小值就輸出,導致了個WA。我也懶得改了。
今天(2018.02.23)重新看一看這個,就想到了預處理之後反著BFS。其實正著BFS也行。不知道我為什麽腦子靈光一閃選擇了反著。。
先交了一次,RE+WA 60分。先隨手把幾個數組開大到400,然後在BFS裏解決了一個判斷是否空隊列,莫名A了。
這是AC代碼:
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 ///P1135 5 int n,A,B,x; 6 7 int p[402],ptop,ptail=1; 8 bool vis[402]; 9 int step[402]; 10 11 struct floor{ 12 int top,from[202]; 13 }f[202]; 14 15 void bfs(int now) 16 { 17 for(int i=1;i<=f[now].top;i++) 18 { 19 if(vis[f[now].from[i]]) continue; 20 vis[f[now].from[i]]=1; 21 p[++ptop]=f[now].from[i]; 22 step[f[now].from[i]]=step[now]+1; 23 if(f[now].from[i]==A) return; 24 } 25 if(ptop==ptail-1) return; 26 ptail++; 27 bfs(p[ptail-1]); 28 return; 29 } 30 31 int main() 32 { 33 scanf ("%d%d%d",&n,&A,&B); 34 for(int i=1;i<=n;i++) 35 { 36 scanf ("%d",&x); 37 if(i-x>=1) f[i-x].from[++f[i-x].top]=i; 38 if(i+x<=n) f[i+x].from[++f[i+x].top]=i; 39 } 40 memset(step,-1,sizeof(step)); 41 42 vis[B]=true; 43 step[B]=0; 44 p[++ptop]=B; 45 46 bfs(B); 47 48 printf("%d",step[A]); 49 return 0; 50 }AC代碼
手寫隊列,應該很好理解。可以拿來當BFS模板。這次去北京除了學了很多新知識以外,還意外的(意料之中的)提高了代碼實現能力#(滑稽)。
那麽就這樣吧。晚安,11015.
1 #include <cstdio> 2 #include <queue> 3 const int N = 210; 4 5 int n, b, a, k[N]; 6 bool vis[N]; 7 8 struct Sta { 9 int floor, step; 10 Sta(int f, int s) { 11 this->floor = f; 12 this->step = s; 13 } 14 }; 15 16 17 void BFS() { 18 std::queue<Sta> Q; 19 Q.push(Sta(a, 0)); 20 vis[a] = 1; 21 while(!Q.empty()) { 22 Sta s = Q.front(); 23 Q.pop(); 24 if(s.floor == b) { 25 printf("%d", s.step); 26 return; 27 } 28 int p = s.floor + k[s.floor]; 29 if(p > 0 && p <= n && !vis[p]) { 30 vis[p] = 1; 31 Q.push(Sta(p, s.step + 1)); 32 } 33 p = s.floor - k[s.floor]; 34 if(p > 0 && p <= n && !vis[p]) { 35 vis[p] = 1; 36 Q.push(Sta(p, s.step + 1)); 37 } 38 } 39 printf("-1"); 40 return; 41 } 42 43 int main() { 44 scanf("%d%d%d", &n, &a, &b); 45 46 for(int i = 1; i <= n; i++) { 47 scanf("%d", &k[i]); 48 } 49 50 BFS(); 51 52 return 0; 53 }2018兒童節特供:全新AC代碼,僅需12分鐘!
洛谷P1135 奇怪的電梯 BFS例題