本文实例讲述了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