比如有100个人,每个人都有一个唯一编号,例如1-100编号,每个人都有一个词语,还有一个或多个需求词语。如果想要得到这个词语,必须拿比配的需求词语才能兑换。如果里面的某一个拿自己的词语出去换,就需要匹配,这个算法如何实现?主要注意的是:可能编号1需要的词语在编号5手上,但是编号5需要的词语在编号8或者10手上,两者都符合。然而编号8需要的词语在编号22手上,编号10的在31手上,到最后肯定会有人需要编号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]
看是看明白一点,但是思绪还是没清晰。
V => Q L C I G S F T [V]
表示的就是逐个交换的结果呀
在我制造的数据中,所有的路径都是唯一的。不存在多条途径,和换不到的情况
所以展示给你的是基础算法
至于你想试探复杂的情况,那就请你给出测试数据
[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
[X] => M
[Q] => L Q可能想换的也是多向选择,比如A、B、S任意一个都可以。就是这个举例
$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