【发布时间】:2020-04-19 06:31:16
【问题描述】:
我正在用 dfs 解决编程问题。 tldr 如下: 在坐标 x, y 处有 n 头奶牛。他们可以在“可表达性”p 的范围内与其他人交流。仅仅因为牛 a 可以与牛 b 通信,并不意味着 b 可以在没有足够 p 的情况下进行通信。如果一条消息从任何一头奶牛开始,它能够到达的最大奶牛数量是多少?奶牛可以将信息从一个传递到另一个。前任。如果 b 可以听到 a,而 c 听不到 a 但可以听到 b,则 b 可以将信息从 a 传递给 c,因此在这种情况下 3 头奶牛听到了信息。 这是一个示例输入:
4
1 3 5
5 4 3
7 2 1
6 1 1
第一行是 N,接下来的行是奶牛的 x、y 和 p。这是我的代码:
#include <iostream>
#include <cmath>
using namespace std;
int n;
int best=0;
int cnt=1;
struct cow {
int x, y, p;
bool visited=0;
} cows[201];
bool adj[201][201];
bool access (int a, int b) {
return pow(cows[b].x-cows[a].x, 2)+pow(cows[b].y-cows[a].y, 2)<=pow(cows[a].p, 2);
}
void dfs(int cow1) {
for (int i=1; i<=n; i++) {
if (cnt>best)
best=cnt;
if ((!cows[i].visited)&&(adj[cow1][i])) {
cnt=cnt+1;
cows[i].visited=1;
dfs(i);
}
}
return;
}
int main () {
cin>>n;
for (int i=1; i<=n; i++) {
cin>>cows[i].x>>cows[i].y>>cows[i].p;
}
for (int i=1; i<=n; i++) {
for (int j=1; j<=n; j++) {
if (i!=j) {
if(access(i, j)) {
adj[i][j]=1;
}
else {
adj[i][j]=0;
}
}
}
}
for (int i=1; i<=n; i++) {
cows[i].visited=1;
dfs(i);
cnt=1;
for (int j=1; j<=n; j++) {
cows[j].visited=0;
}
}
cout<<best;
}
我不太确定问题出在哪里,但我确定它在 dfs 函数中,而不是在邻接列表的创建中。我的代码仅适用于示例案例。我本质上是对所有 n 例开始牛的消息进行 dfs。
【问题讨论】:
-
您的代码仅适用于示例案例是什么意思?它会抛出错误吗?如果是,是哪一个?另外,我看到的第一件事是您正在以一种可疑的方式初始化您的数组。不要在你的结构之后立即使用
cows[201],而是考虑使用用户提供的n以正确的大小在主函数中初始化数组并将数组作为参数传递。同样在 C++ 中,数组枚举从 0 开始,一直到 n-1。因为你给你的数组一个静态大小,这可能还没有导致错误,但如果你真的初始化了 201 头奶牛,它会。 -
不是错误,它只是输出错误的答案
-
其余的对我来说看起来不错..也许其他人会看到它。但请修复你的阵列。您还在最后一行第 6 行的 for 循环中从 0 开始重置数组(而在其他任何地方都从 1 开始),并且正在访问未定义对象的属性。这种东西会导致 C++ 中的未定义行为。但我认为这不一定会伪造你的结果。到处都是从 0 开始,一直到 n-1。
标签: c++ recursion graph depth-first-search directed-graph