適合新手練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 !";
}
}