#44855: c++解題方法


dvbdarcyvolleyball@gmail.com (kuhaku1027)

學校 : 新北市私立南山高級中學
編號 : 266888
來源 : [114.45.217.186]
最後登入時間 :
2024-12-09 20:42:12
k081. DD搭地鐵 -- DD的奇幻冒險之旅 | From: [203.71.175.118] | 發表日期 : 2024-12-22 12:41

適合新手練BFS的題目,跟其他題目相對較簡單

會錯的地方主要是考慮起點跟終點一開始就一樣,要另外計算。

#include<bits/stdc++.h> //k081
using namespace std;

int bfs(const vector<vector<int>> &m, int start, int end, int limit) {
    if (start == end) return 0; // 起點即終點

    vector<int> visited(m.size(), -1); // 紀錄到每個站的最短距離
    queue<int> q;
    q.push(start);
    visited[start] = 0; // 起點的距離為 0

    while (!q.empty()) {
        int curr = q.front();
        q.pop();

        for (int next : m[curr]) {
            if (visited[next] == -1) { // 尚未訪問
                visited[next] = visited[curr]++; // 更新距離
                if (next == end) { // 抵達目標站
                    return visited[next];
                }
                q.push(next);
            }
        }
    }
    return INT_MAX; // 無法抵達目標站
}

int main(){
    ios::sync_with_stdio(0);cin.tie(0);
    int n;
    cin >> n;
    vector<vector<int>> v(n, vector<int>(n));//輸入
    vector<vector<int>> m(n, vector<int>(n)); //存入哪一站有連到哪一站,以範例一為例,m[0](第0站)中會有1、2、3(到第1、2、3站)
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cin >> v[i][j];
            if(v[i][j]==1){
                m[i].push_back(j);
            }
        }
    }
    int start, end, limit;
    cin >> start >> end >> limit;

    int ans = bfs(m, start, end, limit);//跑經過幾站
    if(ans <= limit){
        cout << ans << "\n";
        cout << "You did it ! You did it !";
    }
    else{
        cout << "You failed the mission and pooped on pants !";
    }
}

 
ZeroJudge Forum