所以我有2d布尔数组a,应该表示不同人之间的关系/友谊。如果每个人的ID(例如数组的值) a [1] [0]为真,则人1和0为朋友。如果2个人是朋友,则他们的“朋友距离”为1。人们也可以通过其他人成为朋友,例如如果a [1] [0] = true,a [2] [0] = true,a [2] [1] = false,那么人1和2不是直接朋友,而是因为人1是与人0的朋友,并且人0是与人2的朋友,人1和2是距离2的朋友。现在,我要递归确定是否2个人是给定距离内的朋友,或者不是。我已经写了这段代码:
public static boolean areFriends(int id0, int id1, int e) {
if (e <= 0) {
return false;
}
if (array[id0][id1]) {
return true;
}
for (int i = 0; i < array.length; i++) {
if (array[id0][i]){
(areFriends(i, id1, --e);
}
}
return false;
}
}
该代码至少应该执行的操作是遍历id0s朋友列表,并检查每个数组项,如果id0和被检查人员idx是朋友。如果它们是重复的方法,则用idx替换id0s位置,并使用--e。因此,再次检查所有idx的关系,如果idx与另一个人成为朋友,则整个循环会重复进行,直到“朋友距离” e太高(因此不存在间接友谊)或找到间接友谊为止。>
但是显然这段代码并不能完全做到这一点,所以我会为我做错的任何技巧或如何纠正错误提供帮助。
答案 0 :(得分:0)
最好将数据表示为图,然后使用Dijikstra算法查找两个节点之间的路径。实际上,每个人都由一个节点表示,两个节点之间的弧线调节了友谊关系。
对于您的数据模块,我建议作为解决方案:
public static boolean areFriends(boolean friends[][], int id1, int id2, int distance) {
if (friends[id1][id2]) {
return true;
}
if (distance == 0) {
return freinds[id1][id2];
}
for (int i = 0; i < friends[id1].length; i++) {
if (i != id1 && friends[id1][i] && areFriends(friends, i, id2, distance - 1)) {
return true;
}
}
return false;
}