使用php解决约瑟夫问题

约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,报道第M个时序号为M的人出列,

然后序号为M+1的人开始从头报数依此类推  报到M的人出列,问最后剩下的那个人的序号是几

利用环形链表来解决这个问题,下面是php实现的实例

/** * 利用环形链表解决约瑟夫问题( * 一群孩子围成一圈(小孩数量为N)开始数数 数到M的人出列 问最后剩下的那个孩子编号是几) * @param $first null 链表的头 * @param $total integer 总数量 * @param $num integer 数到几出列的数字 * @param $mark integer 从第几号开始数 */function ChildCount(&$first,$total,$num,$mark){//先将孩子的数量$total创建成一个环形链表for ($i=0;$i<$total;$i++){$child = new child($i+1);if ($i==0){ $first = $child; $first->next = $first;//将链表的尾节点指向头节点 形成环形链表 $cur = $first;//链表的头节点不能动 需要交给一个临时变量} else {$cur->next = $child;$cur->next->next = $first;//将链表的尾节点指向头节点 形成环形链表$cur = $cur->next;}}//因为链表的节点本身不能删除自己,所以需要一个始终指在头节点后面一个节点的指针$tail = $first;while ($tail->next!=$first){$tail = $tail->next;//当循环结束指针$tail 刚好指在头节点的后面一个节点 }//考虑从第几号数数 将指针移到这个数的位置上for ($i=0;$i<$mark-1;$i++){$first = $first->next;$tail = $tail ->next;}//开始数数while ($tail!=$first){for ($i=0;$i<$num-1;$i++){echo '
出圈额人的编号是'.$first->no;$first = $first->next;$tail = $tail ->next;}//当退出for循环的时候说明数到了该删除的小孩了 将其删除$first = $first->next;$tail->next = $first;}echo '
最后留在圈圈的人的编号是'.$tail->no;}//创建头节点$first = null;//创建环形链表//create($first,4);//遍历环形链表//show($first);//解决约瑟夫问题ChildCount($first,4,2,4);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值