PHP算法学习(8) 环形链表 解决约瑟夫问题
2019年2月25日17:29:17
Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓。于是决定了自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀。然后下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
抽象出的问题是 N个人围成一圈,从第S个人开始报数,报到C的人出圈,从出去的人的下一位,继续从下一任开始重新报数,报到m的人出圈;如此往复,直到所有人出圈。
final class Kid {
public $no;
public $next = null;
public function __construct($no) {
$this->no = $no;
}
}
<?php /*
* 环形链表 解决约瑟夫问题
*/ final class CircularLinkedList { public function addKid($n = 0, &$head = null) {
for ($i = 0; $i < $n; $i++) {
$Kid = new Kid($i + 1);
if ($i == 0) { //第一个小孩的情况
$head = $Kid; //对象赋值,是引用赋值
$head->next = $Kid; //自己指向自己
$current = $head; //对象赋值,是引用赋值
} else {
$current->next = $Kid;
$Kid->next = $head;
// //继续指向下一个
$current = $current->next;
}
}
} /*
* $start 从几开始
* $count 数到几就出圈
*/ public function play(Kid $head, $start, $count) {
$current = $head;
//移动指针从$start 移动到
while (1) {
if ($current->no == $start) {
break;
}
$current = $current->next;
}
// p($current);
// pp($this->countKids($current));
// $all = $this->countKids($current); while ($current->next != $current->next->next) {
//少移动一位,方便一处节点
for ($i = 1; $i < $count; $i++) {
$current = $current->next;
}
//去除节点
// p($current);
p('出去的小孩是 --' . $current->next->no);
$current->next = $current->next->next;
// p($current);
//移动指针,移到删除节点的下一位就是重新数数的那个节点
$current = $current->next;
}
p($current->no);
} public function countKids(Kid $head) {
$current = $head;
$count = 1;
while ($head->no != $current->next->no) {
$count++;
$current = $current->next;
} return $count;
} }
调用
$CircularLinkedList = new CircularLinkedList();
$CircularLinkedList->addKid(10, $head);
$CircularLinkedList->play($head, 3, 2);
结果
出去的小孩是 --5
出去的小孩是 --8
出去的小孩是 --1
出去的小孩是 --4
出去的小孩是 --9
出去的小孩是 --3
出去的小孩是 --10
出去的小孩是 --7
出去的小孩是 --2
6
PHP算法学习(8) 环形链表 解决约瑟夫问题的更多相关文章
- php实现单,双向链表,环形链表解决约瑟夫问题
传智播客PHP学院 韩顺平 PHP程序员玩转算法第一季 http://php.itcast.cn 聊天篇: 数学对我们编程来说,重不重要? 看你站在什么样的层次来说. 如果你应用程序开发,对数学要求 ...
- 单向环形链表解决约瑟夫环(Josephus)问题
一.约瑟夫环问题 Josephu 问题为:设编号为1,2,- n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那 ...
- java 环形链表实现约瑟夫(Joseph)问题
约瑟夫问题又名丢手绢问题.相传著名犹太历史学家 Josephus 利用其规则躲过了一场自杀游戏,而后投降了罗马. 问题: 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.* 从编号为 ...
- 使用java的循环单向链表解决约瑟夫问题
什么是约瑟夫问题 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定 ...
- 数据结构与算法——链表 Linked List(单链表、双向链表、单向环形链表-Josephu 问题)
链表是有序的列表,但是在内存中存储图下图所示 链表是以 节点 的方式来存储,是 链式存储 每个节点包含 data 域.next 域,指向下一个节点 链表的各个节点 不一定是连续存储,如上图所示 链表还 ...
- Java数据结构之单向环形链表(解决Josephu约瑟夫环问题)
1.Josephu(约瑟夫.约瑟夫环)问题: 设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m ...
- 3,java数据结构和算法:约瑟夫环出队顺序, 单向环形链表的应用
什么是约瑟夫环? 就是数小孩游戏: 直接上代码: 要实现这个,只需要理清思路就好了 孩子节点: class Boy{ int no;//当前孩子的编码 Boy next; // 下一节点 public ...
- 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表II
[算法训练营day4]LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表 ...
- 打败算法 —— 环形链表 II
本文参考 出自LeetCode上的题库 -- 环形链表II,哈希表和快慢指针两种解法都需要O(n)的时间,但快慢指针仅占用O(1)的空间 https://leetcode-cn.com/problem ...
随机推荐
- Celery - 一个懂得 异步任务 , 定时任务 , 周期任务 的芹菜
1.什么是Celery?Celery 是芹菜Celery 是基于Python实现的模块, 用于执行异步定时周期任务的其结构的组成是由 1.用户任务 app 2.管道 broker 用于存储 ...
- JAVA进阶10
间歇性混吃等死,持续性踌躇满志系列-------------第10天 1.Random package cn.intcast.day08.demo01; import java.util.Random ...
- Python3.6及以上pip安装pymssql错误的解决办法[Windows&Linux freetds安装]
只有由于Python3.6装不上 pymssql,所以一直用Python3.5的版本. 报错界面 现在有了新的解决方法: 原帖如下: https://docs.microsoft.com/en-us/ ...
- Python的真和假
python和其他编程语言一样,,,0是假,非0是真,,python 一切皆对象,真假是每个对象的属性.像数据结构,,空的数据结构是False. eg: "spam" True & ...
- Saltstack自动化操作记录(2)-配置使用
之前梳理了Saltstack自动化操作记录(1)-环境部署,下面说说saltstack配置及模块使用: 为了试验效果,再追加一台被控制端minion机器192.168.1.118需要在master控制 ...
- dos.orm
引言: Dos.ORM(原Hxj.Data)于2009年发布.2015年正式开源,该组件已在数百个成熟项目中应用,是目前国内用户量最大.最活跃.最完善的国产ORM.初期开发过程中参考了NBear与My ...
- vue+cordova插件使用,bluetoothSerial.connect()连接失败
这是GitHub地址https://github.com/don/BluetoothSerial
- Caffe+Matlab'hole
有时候,多坚持一小下下就成功了,遇到问题就频繁重装系统并不可取!放弃很容易,但坚持真的很酷! 1.安装依赖库也能出问题 命令行输入: sudo apt-get install libprotobuf- ...
- 《剑指offer》整数中1出现的次数
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
- 阿里云ECS发送邮件到腾讯企业邮箱
1.安装软件 yum install mailx yum install sendmail 2.配置 vim /etc/mail.rc在文件最后加上如下内容: set smtp=smtps://smt ...