小弟现在遇到一个算法问题,大致是这样的,如上图:两点之间的直线表示这两点 有直接联系
已知条件是:给出任意一点,可以得到与它有直接联系的点,比如 知道了 3,就可以查出 1,2,4,其它的点 得不到
现在问题就是:给出任意一点,要查出所有和 这点有直接 或间接联系的点,比如:给出 4 就要得到 1~8,请问 如何用函数模拟,请高手指点,思路或函数 示意 都可以!谢谢!

解决方案 »

  1.   

    图片 地址 是:http://hi.csdn.net/space-2715526-do-album-picid-498838.html
    不能显示,不知道为什么,我到 递归,可是搞不好
      

  2.   


    /**
     * 得到该点 涉及到 的所有 已发生或正在进行的战斗id
     * @param map_id
     * @return
     */
    public Set<String> getReferBattleIds(String map_id){

    while (true) {
    battleIdSet.add(map_id);
    //查出与当前点
    List<BattleInfoVO> battleinfovo =battleInfoBean.getBattleInfoForPoint(map_id);
    for (int i = 0; i < battleinfovo.size(); i++) {
    String start = battleinfovo.get(i).getAssault_target_id();
    String end = battleinfovo.get(i).getTo_assault_target_id();
    battleIdSet.add(start);
    battleIdSet.add(end);
    }
    }
    return battleIdSet;
    }
    map_id 就表示一个点,在项目里就是一个玩家,这个函数要处理 就是 玩家1上线的时候,所有攻击它 的人找出来 ,例如玩家2 打了玩家1,但是在玩家2打之前,玩家3可能先打了玩家2,所以先要找出有间接联系到玩家1的点,大致就是这样 
      

  3.   

    List<BattleInfoVO> battleinfovo =battleInfoBean.getBattleInfoForPoint(map_id);    
    就是可以找出 与map_id直接联系的点,找出所有点 放到 battleIdSet 问题就解决了
      

  4.   

    String start = battleinfovo.get(i).getAssault_target_id();
                    String end = battleinfovo.get(i).getTo_assault_target_id();
                    battleIdSet.add(start);
                    battleIdSet.add(end);                
    这是在干什么
      

  5.   

    battleinfovo 里面存放有 战斗的 攻击者id 和 被攻击 id,就是 start  和 end,
    因为 map_id 有可能是 start 也 可能是 end 所以 我 就用
    List<BattleInfoVO> battleinfovo = battleInfoBean.getBattleInfoForPoint(map_id);
    for (int i = 0; i < battleinfovo.size(); i++) {
    String start = battleinfovo.get(i).getAssault_target_id();
    String end = battleinfovo.get(i).getTo_assault_target_id();
    battleIdSet.add(start);
    battleIdSet.add(end);
    }就能找出 所有 当前 map_id 相关的点了
      

  6.   

    我想问一下,如果玩家4又打了玩家3 呢?就是说你想找这个间接关系的到底是间接到什么程度。如果不管我说的玩家4了,可以在for 里面再针对没一个直接相关玩家找出他们的相关玩家再组合。如果还要考虑玩家4、5、6 那你是不是要改一下battleInfoBean.getBattleInfoForPoint(map_id)这个函数以方便递归?   
                                           
      

  7.   

    本来我是这样写的:
    public Set<String> getReferBattleIds(String map_id){
     Set<String> battleIdSet = new HashSet<String>();
         Set<String> newBattleId = new HashSet<String>(); //保存查找到的新的点
    while (true) {
    battleIdSet.add(map_id);
    //查出与当前点相关的战斗点
    List<BattleInfoVO> battleinfovo = battleInfoBean.getBattleInfoForPoint(map_id);
    for (int i = 0; i < battleinfovo.size(); i++) {
    String start = battleinfovo.get(i).getAssault_target_id();
    String end = battleinfovo.get(i).getTo_assault_target_id();
    if (!start.equals(map_id)) {
    newBattleId.add(start);
    }
    if (!end.equals(map_id)) {
    newBattleId.add(end);
    }
    //然后就不知道怎么写了
    }
    }
    return battleIdSet;
    }
      

  8.   

    间接 就是只要 像 图里面,除了 9 ,10,11 和玩家1 没联系,其它的都算有直接或间接联系
    可以修改 battleInfoBean.getBattleInfoForPoint(map_id),可以返回 直到: 有一个 点 只有 一条直线与它连接,比如 图中的 7
      

  9.   

    battleIdSet是个什么东西 
    为什么你要retrun一个set
      

  10.   


    battleIdSet 存放所有查找到的点id,因为可能会查到 有重复的,所以用set,不用set也可以的,只要能返回所有点就可以了。
     
      

  11.   

    List<BattleInfoVO> battleinfovo = battleInfoBean.getBattleInfoForPoint(map_id);
    for (int i = 0; i < battleinfovo.size(); i++) {
    String start = battleinfovo.get(i).getAssault_target_id();
    String end = battleinfovo.get(i).getTo_assault_target_id();
    battleIdSet.add(start);
    battleIdSet.add(end);
    getReferBattleIds(start);
    getReferBattleIds(end);
    }
    就行了
      

  12.   

    这样没有跳出while循环的条件啊