就拿这道题为例:https://www.luogu.com.cn/problem/P1135
我本地的 vs2022
用这份代码是正确的:
#include <iostream>
#include <queue>
using namespace std;
const int N = 205;
int k[N];
int n, a, b;
bool visit[N << 1];
struct Node
{
int num, times;
};
void bfs()
{
queue<Node> q;
Node t;
t.num = t.times = 0;
int cnt = 0;
q.push(Node(a, 0));
while (!q.empty())
{
t = q.front();
q.pop();
if (t.num == b)
{
cout << t.times << endl;
return;
}
if (t.num + k[t.num] <= n && !visit[t.num + k[t.num]])
{
q.push(Node(t.num + k[t.num], t.times + 1));
visit[t.num + k[t.num]] = true;
}
if (t.num - k[t.num] >= 1 && !visit[t.num - k[t.num]])
{
q.push(Node(t.num - k[t.num], t.times + 1));
visit[t.num - k[t.num]] = true;
}
}
cout << "-1\n";
}
int main()
{
cin >> n >> a >> b;
for (int i = 1; i <= n; i++)
{
cin >> k[i];
}
bfs();
return 0;
}
但是 luogu 的评测机会 CE,要改成这样:
#include <iostream>
#include <queue>
using namespace std;
const int N = 205;
int k[N];
int n, a, b;
bool visit[N << 1];
struct Node
{
int num, times;
};
void bfs()
{
queue<Node> q;
Node t;
t.num = t.times = 0;
int cnt = 0;
q.push((Node){a, 0});
while (!q.empty())
{
t = q.front();
q.pop();
if (t.num == b)
{
cout << t.times << endl;
return;
}
if (t.num + k[t.num] <= n && !visit[t.num + k[t.num]])
{
q.push((Node){t.num + k[t.num], t.times + 1});
visit[t.num + k[t.num]] = true;
}
if (t.num - k[t.num] >= 1 && !visit[t.num - k[t.num]])
{
q.push((Node){t.num - k[t.num], t.times + 1});
visit[t.num - k[t.num]] = true;
}
}
cout << "-1\n";
}
int main()
{
cin >> n >> a >> b;
for (int i = 1; i <= n; i++)
{
cin >> k[i];
}
bfs();
return 0;
}
但是这样 vs
又会 CE,那么正规考试到底用哪个?