遇到一个不会的算法问题,请高手指点,谢谢! 小弟现在遇到一个算法问题,大致是这样的,如上图:两点之间的直线表示这两点 有直接联系已知条件是:给出任意一点,可以得到与它有直接联系的点,比如 知道了 3,就可以查出 1,2,4,其它的点 得不到现在问题就是:给出任意一点,要查出所有和 这点有直接 或间接联系的点,比如:给出 4 就要得到 1~8,请问 如何用函数模拟,请高手指点,思路或函数 示意 都可以!谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 图片 地址 是:http://hi.csdn.net/space-2715526-do-album-picid-498838.html不能显示,不知道为什么,我到 递归,可是搞不好 /** * 得到该点 涉及到 的所有 已发生或正在进行的战斗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的点,大致就是这样 List<BattleInfoVO> battleinfovo =battleInfoBean.getBattleInfoForPoint(map_id); 就是可以找出 与map_id直接联系的点,找出所有点 放到 battleIdSet 问题就解决了 String start = battleinfovo.get(i).getAssault_target_id(); String end = battleinfovo.get(i).getTo_assault_target_id(); battleIdSet.add(start); battleIdSet.add(end); 这是在干什么 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 相关的点了 我想问一下,如果玩家4又打了玩家3 呢?就是说你想找这个间接关系的到底是间接到什么程度。如果不管我说的玩家4了,可以在for 里面再针对没一个直接相关玩家找出他们的相关玩家再组合。如果还要考虑玩家4、5、6 那你是不是要改一下battleInfoBean.getBattleInfoForPoint(map_id)这个函数以方便递归? 本来我是这样写的: 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; } 间接 就是只要 像 图里面,除了 9 ,10,11 和玩家1 没联系,其它的都算有直接或间接联系可以修改 battleInfoBean.getBattleInfoForPoint(map_id),可以返回 直到: 有一个 点 只有 一条直线与它连接,比如 图中的 7 battleIdSet是个什么东西 为什么你要retrun一个set battleIdSet 存放所有查找到的点id,因为可能会查到 有重复的,所以用set,不用set也可以的,只要能返回所有点就可以了。 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);}就行了 这样没有跳出while循环的条件啊 String和String数组的两种创建方式的不同 标中输出的问题 一个insert语句 一个座位的分配 如何分解、加减日期型? java代码中用了移位操作,编译通不过,提示可能精度会损失。 jbX为什么不能Debug啊??? 哪个高手能给解释一下池线程的感念啊?它用来干什么的? 请问如何用java写一个日志文件 紧急求助!谢谢! java基本数据类型以及编码标准的问题,求高手解答 打字测速程序遇到的一个颜色显示问题求教!
不能显示,不知道为什么,我到 递归,可是搞不好
/**
* 得到该点 涉及到 的所有 已发生或正在进行的战斗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的点,大致就是这样
就是可以找出 与map_id直接联系的点,找出所有点 放到 battleIdSet 问题就解决了
String end = battleinfovo.get(i).getTo_assault_target_id();
battleIdSet.add(start);
battleIdSet.add(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 相关的点了
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;
}
可以修改 battleInfoBean.getBattleInfoForPoint(map_id),可以返回 直到: 有一个 点 只有 一条直线与它连接,比如 图中的 7
为什么你要retrun一个set
battleIdSet 存放所有查找到的点id,因为可能会查到 有重复的,所以用set,不用set也可以的,只要能返回所有点就可以了。
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);
}
就行了