比如有100个人,每个人都有一个唯一编号,例如1-100编号,每个人都有一个词语,还有一个或多个需求词语。如果想要得到这个词语,必须拿比配的需求词语才能兑换。如果里面的某一个拿自己的词语出去换,就需要匹配,这个算法如何实现?主要注意的是:可能编号1需要的词语在编号5手上,但是编号5需要的词语在编号8或者10手上,两者都符合。然而编号8需要的词语在编号22手上,编号10的在31手上,到最后肯定会有人需要编号1的词语。这样循环寻找,会有多个分支。谁能给予一些思路或者算法。不限语言,不限实现方式。

解决方案 »

  1.   

    /*
    你的问题描述的比较宽泛,但依然能看到这是一个图的遍历问题
    为了便于说明,我把问题简化成了字母配对
    */
    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]
      

  2.   

    感谢xuzuning的帮助。多个分支呢?例如1手头拿着一个字母F,想换到字母S,中间可能产生很多个分支,最终有些可能换到S,有些换不到。但是要把所有分支全部显示出来。
    看是看明白一点,但是思绪还是没清晰。
      

  3.   

    你没有看明白我给的结果吗?
    V => Q L C I G S F T [V]
    表示的就是逐个交换的结果呀
    在我制造的数据中,所有的路径都是唯一的。不存在多条途径,和换不到的情况
    所以展示给你的是基础算法
    至于你想试探复杂的情况,那就请你给出测试数据
      

  4.   

    因为可能会出现多条途径 达到共同的结果。因为有可能有些编号拿到的字母是一样的,或者想要换的需求字母也是多样选择的,这样就会存在多个途径了。例如:有点需要注明的是:例如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
      

  5.   

     [V] => Q  V可能想换Q、M、U都可以,只要符合其中一个条件就换。
        [X] => M
        [Q] => L Q可能想换的也是多向选择,比如A、B、S任意一个都可以。就是这个举例
      

  6.   

    $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