【DFS與BFS】洛谷 P1135 奇怪的電梯
阿新 • • 發佈:2021-12-08
因為此題資料範圍較小,有dfs及bfs等多種做法。
DFS
比較正常的dfs,注意vis陣列一定要回溯,不然會漏情況
例如這個資料
11 1 5
1 5 20 1 20 20 3 20 20 1 7
有無回溯vis陣列結果不一樣
程式碼:
#include <iostream> using namespace std; typedef long long ll; int n, a, b, minn = 0x7fffffff; int A[300], vis[300];//vis陣列用來標記所走過的樓層 void dfs(int num, int step) { if (num == b) { minn = min(minn, step); return; } if (num > n || num < 1) return; if (!vis[num] && step < minn) { vis[num] = 1; dfs(num + A[num], step + 1); dfs(num - A[num], step + 1); vis[num] = 0;//回溯vis陣列 } } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> a >> b; for (int i = 1; i <= n; ++i) { cin >> A[i]; } dfs(a, 0); if (minn != 0x7fffffff) cout << minn << endl; else cout << -1 << endl; return 0; }
BFS
由於要同時記錄樓層和步數,所以選擇在queue裡套一個pair,用結構體也是可以的,但pair比較短
用pair定義起來方便,但用起來其實沒有結構體方便。。。
程式碼:
#include <iostream> #include <queue> using namespace std; typedef long long ll; queue<pair<int, int>> q; int A[300], vis[300]; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, a, b; cin >> n >> a >> b; for (int i = 1; i <= n; ++i) { cin >> A[i]; } q.push(make_pair(a, 0)); vis[a] = 1; int f = 0; while (!q.empty()) { int num = q.front().first, step = q.front().second; if (num == b) { f = 1; break; } q.pop(); if (num + A[num] <= n && !vis[num + A[num]]) { vis[num + A[num]] = 1; q.push(make_pair(num + A[num], step + 1)); } if (num - A[num] >= 1 && !vis[num - A[num]]) { vis[num - A[num]] = 1; q.push(make_pair(num - A[num], step + 1)); } } if (f) cout << q.front().second << endl; else cout << -1 << endl; return 0; }