满载而归 小红书
笔试时没有写出来,但是可以作为参考,如果有错误,请指正。
思路是,把海盗行船路径看成一颗n叉树,
例如
输入为:
5
2 3 3
2 3 5
海盗所有的路径为:
n是多少呢?
对于本例 ,速度可以取2,3,所以n为2, 是一颗二叉树。
采用bfs,遍历每个节点,利用hash表判断当前地点是否为危险地点。
#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
#include <algorithm>
#include <climits>
using namespace std;
vector<int> vec;
//测试1
/*
5
2 3 3
2 3 5
*/
//测试2
/*
10
2 3 4
2 3 5 6
*/
int main()
{
int X;
int L, T, N;
int res = INT_MAX;
cin >> X;
cin >> L >> T >> N;
unordered_map<int, bool> A;
queue<pair<int,int>> q;
int tmp;
for (int i = 0; i < N; i++)
{
cin >> tmp;
A[tmp] = true;
}
q.push(make_pair(0, 0));
while (!q.empty())
{
int cur = q.front().first;
int cnt = q.front().second;
q.pop();
if (cur>= X)
{
continue;
}
for (int v = L; v <= T; v++)
{
int forwardV = cur + v;
if (A.find(forwardV) != A.end())
{
q.push(make_pair(forwardV, cnt + 1));
}
else
q.push(make_pair(forwardV, cnt));
if (forwardV >= X)
{
int tmp = q.back().second;
vec.push_back(tmp);
}
}
}
//for (auto ele : vec) //打印,根据测试用例,判断一下遍历是否有问题
//{
// cout << ele << " ";
//}
for (int i = 0; i < vec.size(); i++)
{
res = min(res, vec[i]);
}
cout << res << endl;
system("pause");
}