1. 程式人生 > 其它 >【DFS與BFS】洛谷 P1135 奇怪的電梯

【DFS與BFS】洛谷 P1135 奇怪的電梯

題目:奇怪的電梯 - 洛谷 (luogu.com.cn)

因為此題資料範圍較小,有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;
}