关于算法的问题

tungh 2015-04-01 03:43:29
比如有100个人,每个人都有一个唯一编号,例如1-100编号,每个人都有一个词语,还有一个或多个需求词语。如果想要得到这个词语,必须拿比配的需求词语才能兑换。如果里面的某一个拿自己的词语出去换,就需要匹配,这个算法如何实现?

主要注意的是:可能编号1需要的词语在编号5手上,但是编号5需要的词语在编号8或者10手上,两者都符合。然而编号8需要的词语在编号22手上,编号10的在31手上,到最后肯定会有人需要编号1的词语。这样循环寻找,会有多个分支。谁能给予一些思路或者算法。不限语言,不限实现方式。
...全文
168 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2015-04-04
  • 打赏
  • 举报
回复
可能想换的也是多向选择,只要符合其中一个条件就换 这算是什么条件?
tungh 2015-04-04
  • 打赏
  • 举报
回复
请问还有思路吗?
xuzuning 2015-04-04
  • 打赏
  • 举报
回复
$s = 'V';
$t = 'M';

$loop = count($d);
while($loop-- && $d[$s] != $t) {
  echo "$s=>{$d[$s]} - ";
  $s = $d[$s];
}
echo "\$d[$s]:{$d[$s]}";
V=>Q - Q=>L - L=>C - C=>I - I=>G - G=>S - S=>F - F=>T - T=>V - V=>Q - Q=>L - L=>C - C=>I - I=>G - G=>S - S=>F - F=>T - T=>V - V=>Q - Q=>L - L=>C - C=>I - I=>G - G=>S - S=>F - F=>T - $d[T]:V
tungh 2015-04-04
  • 打赏
  • 举报
回复
[V] => Q V可能想换Q、M、U都可以,只要符合其中一个条件就换。 [X] => M [Q] => L Q可能想换的也是多向选择,比如A、B、S任意一个都可以。 就是这个举例
xuzuning 2015-04-02
  • 打赏
  • 举报
回复
/*
你的问题描述的比较宽泛,但依然能看到这是一个图的遍历问题
为了便于说明,我把问题简化成了字母配对
*/
srand(0); //固定的随机数种子,可使数据再现
//构造数据
$t = str_split('ABCDEFGHIJKLMNOPQRSTUVWXYZ');
shuffle($t);
$a = $t;
shuffle($t);
$b = $t;
$d = array_combine($a, $b);
print_r($d); //看一下

foreach($d as $k=>$v) {
  echo "$k => ";
  while($d[$v] != $k) {
    echo "$v ";
    $v = $d[$v];
  }
  echo "$v [{$d[$v]}]\n";
}
Array
(
    [V] => Q
    [X] => M
    [Q] => L
    [A] => X
    [K] => Z
    [O] => A
    [S] => F
    [U] => B
    [B] => U
    [C] => I
    [Z] => W
    [M] => Y
    [N] => E
    [W] => R
    [I] => G
    [R] => D
    [T] => V
    [G] => S
    [L] => C
    [P] => H
    [Y] => O
    [D] => K
    [F] => T
    [H] => J
    [E] => N
    [J] => P
)
V => Q L C I G S F T [V]
X => M Y O A [X]
Q => L C I G S F T V [Q]
A => X M Y O [A]
K => Z W R D [K]
O => A X M Y [O]
S => F T V Q L C I G [S]
U => B [U]
B => U [B]
C => I G S F T V Q L [C]
Z => W R D K [Z]
M => Y O A X [M]
N => E [N]
W => R D K Z [W]
I => G S F T V Q L C [I]
R => D K Z W [R]
T => V Q L C I G S F [T]
G => S F T V Q L C I [G]
L => C I G S F T V Q [L]
P => H J [P]
Y => O A X M [Y]
D => K Z W R [D]
F => T V Q L C I G S [F]
H => J P [H]
E => N [E]
J => P H [J]

人鱼传说 2015-04-02
  • 打赏
  • 举报
回复
有点意思的问题
tungh 2015-04-02
  • 打赏
  • 举报
回复
因为可能会出现多条途径 达到共同的结果。因为有可能有些编号拿到的字母是一样的,或者想要换的需求字母也是多样选择的,这样就会存在多个途径了。 例如: 有点需要注明的是:例如V换Q,前提是Q愿意和V换,也就是Q的交换条件里肯定包括V在内,可能也是多向的,例如V、G等 [V] => Q V可能想换Q、M、U都可以,只要符合其中一个条件就换。 [X] => M [Q] => L Q可能想换的也是多向选择,比如A、B、S任意一个都可以。 [A] => X [K] => Z [O] => A [S] => F [U] => B [B] => U [C] => I [Z] => W [M] => Y [N] => E [W] => R [I] => G [R] => D [T] => V [G] => S [L] => C [P] => H [Y] => O [D] => K [F] => T [H] => J [E] => N [J] => P
xuzuning 2015-04-02
  • 打赏
  • 举报
回复
你没有看明白我给的结果吗? V => Q L C I G S F T [V] 表示的就是逐个交换的结果呀 在我制造的数据中,所有的路径都是唯一的。不存在多条途径,和换不到的情况 所以展示给你的是基础算法 至于你想试探复杂的情况,那就请你给出测试数据
tungh 2015-04-02
  • 打赏
  • 举报
回复
感谢xuzuning的帮助。 多个分支呢? 例如1手头拿着一个字母F,想换到字母S,中间可能产生很多个分支,最终有些可能换到S,有些换不到。但是要把所有分支全部显示出来。 看是看明白一点,但是思绪还是没清晰。

21,888

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧