Cho mảng arr các số nguyên không âm, bắt đầu tại chỉ số start. Tại chỉ số i, có thể nhảy đến i + arr[i] hoặc i - arr[i]. Kiểm tra xem có thể đến chỉ số nào có giá trị 0 hay không. Không được nhảy ra khỏi mảng.
Ví dụ: arr = [4,2,3,0,3,1,2], start = 5. Kết quả: true. Đường đi: 5 → 4 → 1 → 3 hoặc 5 → 6 → 4 → 1 → 3.
Giải thuật (BFS)
n= kích thướcarr.- Khởi tạo hàng đợi
q, thêmstart. Tậpvisitedchứastart. - Khi
qkhông rỗng: - Lấy
currtừ đầu hàng đợi. - Nếu
arr[curr] == 0, trả vềtrue. - Nếu
curr + arr[curr] < nvà chưa thăm, thêm vàoqvàvisited. - Nếu
curr - arr[curr] >= 0và chưa thăm, thêm vàoqvàvisited. - Trả về
falsenếu hết hàng đợi.
Ví dụ C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool canReach(vector<int>& arr, int start) {
int n = arr.size();
queue<int> q;
q.push(start);
set<int> visited;
visited.insert(start);
while(!q.empty()) {
int curr = q.front(); q.pop();
if(arr[curr] == 0) return true;
if(curr + arr[curr] < n && !visited.count(curr + arr[curr])) {
q.push(curr + arr[curr]);
visited.insert(curr + arr[curr]);
}
if(curr - arr[curr] >= 0 && !visited.count(curr - arr[curr])) {
q.push(curr - arr[curr]);
visited.insert(curr - arr[curr]);
}
}
return false;
}
};
int main() {
vector<int> v = {4,2,3,0,3,1,2};
Solution ob;
cout << (ob.canReach(v, 5));
return 0;
}
Đầu vào
[4,2,3,0,3,1,2] 5
Đầu ra
1