递归地找到“间接关系”

时间:2019-11-17 20:31:44

标签: java recursion

所以我有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太高(因此不存在间接友谊)或找到间接友谊为止。

但是显然这段代码并不能完全做到这一点,所以我会为我做错的任何技巧或如何纠正错误提供帮助。

1 个答案:

答案 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;
}