本文实例讲述了php基于环形链表解决约瑟夫环问题。分享给大家供大家参考,具体如下:
先来重温一下约瑟夫环问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。
前面介绍了关联数组解决约瑟夫环的方法,环形链表解决约瑟夫环的方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
<?php header( "content-type:text/html;charset=utf-8" ); class Child{ public $no ; public $next =null; public function __construct( $no ){ $this ->no= $no ; } } function addChild( $n ,& $first ){ //$n是人的个数,创建环形链表 for ( $i =0; $i < $n ; $i ++){ $child = new Child( $i +1); if ( $i ==0){ $first = $child ; $cur = $child ; $cur ->next= $cur ; } else { $cur ->next= $child ; $child ->next= $first ; $cur = $cur ->next; } } } function showHero( $first ){ $cur = $first ; while ( $cur ->next!= $first ){ echo "<br/>人的编号:" . $cur ->no; $cur = $cur ->next; } echo "<br/>人的编号:" . $cur ->no; } function countChild( $first , $m , $k ){ $cur = $first ; for ( $i =0; $i < $m -1; $i ++){ $cur = $cur ->next; } $j =0; while ( $cur != $cur ->next){ if ( $j == $k -2){ echo "<br/>出列编号:" . $cur ->next->no; $cur ->next= $cur ->next->next; $cur = $cur ->next; $j =0; } else { $cur = $cur ->next; $j ++; } } echo "<br/>最后出列编号:" . $cur ->no; } addChild(10, $first ); showHero( $first ); echo "<hr/>" ; countChild( $first ,2,3); //第二个人开始数,数到三出列 ?> |
运行结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
人的编号:1 人的编号:2 人的编号:3 人的编号:4 人的编号:5 人的编号:6 人的编号:7 人的编号:8 人的编号:9 人的编号:10 -------------------------------------------------------------------------------- 出列编号:4 出列编号:7 出列编号:10 出列编号:3 出列编号:8 出列编号:2 出列编号:9 出列编号:6 出列编号:1 最后出列编号:5 |
希望本文所述对大家PHP程序设计有所帮助。
原文链接:http://www.oschina.net/code/snippet_723831_15617