约瑟夫问题

来源:互联网 发布:绿岸网络 编辑:程序博客网 时间:2024/06/04 22:51

约瑟夫问题:个人围成一圈,从第 个开始报数,第 个将被杀掉,最后剩下一个,其余人都将被杀掉。例如i=1,N=5,M=4,被杀掉的人的序号为4 , 3 ,5 , 2。最后剩下1号。

 PHP 实现:

<?php /**  * 创建链表结构(类代替)  * @param no    */class Node{public $no;public $next;public function __construct($no){$this->no=$no;}}/** * 创建(循环)链表 */Class cycleLink{public $first;//初始头结点public function __construct(){$this->first=new Node(1);//创建头结点}public function createLink($N){$cur=$this->first;for ($i=2;$i<=$N;$i++){$new=new Node($i);$cur->next=$new;$cur=$new;}$cur->next=$this->first;//合并环路}function showLink(){$cur=$this->first;while($cur->next!=$this->first){echo "LinkNo:".$cur->no."<br>";$cur=$cur->next;}echo "LinkNo:".$cur->no."<br>";//显示末尾的一个}function CycleDel($M,$offSet){if ($M<=1)  exit("M 需要大于1");//按照偏移量将头结点往后移动for($i=1;$i<$offSet;$i++){$this->first=$this->first->next;//向后移动}$cur=$this->first;//游标指向头指针while($cur->next!=$cur){for($i=1;$i<$M-1;$i++){$cur=$cur->next;}echo "删除节点".$cur->next->no."<br>";$cur->next=$cur->next->next;//删除节点$cur=$cur->next;//echo $cul->no."**";}echo "最后剩下的是:".$cur->no;}}$N=50;//总人数$M=4;//一次数多少个$offSet=1;//从第几个开始$Link=new cycleLink;$Link->createLink($N);$Link->showLink();$Link->CycleDel($M,$offSet)//showLink($first);?>


0 0