PHP篇之二个函数解决约瑟夫环问题
来源:互联网 发布:徐州蹦花网络 编辑:程序博客网 时间:2024/05/01 00:00
讲故事了!
约瑟夫环问题起源于一个犹太故事。:
罗马人攻占了桥塔帕特,41个人藏在一个山洞中躲过了这场浩劫。这41个人中,包括历史学家Josephus(约瑟夫)和他的一个朋友。剩余的39个人为了表示不向罗马人屈服,决定集体自杀。大家制定了一个自杀方案,所有这41个人围成一个圆圈,由第一个人开始顺时针报数,每报数为3的人就立刻自杀,然后再由下一个人重新开始报数,仍然是每报数为3的人就立刻自杀……,直到所有的人都自杀身亡为止。
约瑟夫和他的朋友并不想自杀,于是约瑟夫想到了一个计策,他们两个同样参与到自杀方案中,但是最后却躲过了自杀。请问,他们是怎么做到的?
分析这道题思路有很多种,我的思路分为两步
第一步 抽象成一个队列添加元素到另一个队列中
假设队列A中有n个元素,队A不断进行出队操作,每次元素出队后都判断元素是否符合添加到队B的条件(结合约瑟夫环问题就是:如果是3的倍数,就不符合入队的条件)
第二步 改进第一步
可以认为是一个队S,这个队S在不断进行出队和入队的操作(就是出队的元素再次添加到队尾),如果出队元素为不符合再次入队的条件就踢出.
相关函数 range() count() array_shift() array_push()
代码实现
function ysf($n,$m) { $i=0; $arr = range(1,$n);//创建:含有100个值的数组 while(count($arr)>=$m) { ++$i; //不断出队(即删除数组的第一个元素) $survice = array_shift($arr); if($i%$m<>0){ //结合约瑟夫环问题 //报到3就自杀(从队列中踢出),否则等待下一次的审判(再次添加到队尾) array_push($arr, $survice); } elseif($i>count($survice)){$i=0;}#这句代码加不加都无所谓,便于理解 } return $arr; } //是不是很好奇 约瑟夫将他和它的朋友安排在哪个位置,逃过一死的呢? //调用 输出 看看 print_r( ysf(41,3) );######console################Array( [0] => 16 [1] => 31 )这里封装成函数的理由很简单,当我需要的时候,我就能调用它逃过一死了(哈哈哈....)
总结 这个方法执行效率不是太高 .因为操作代价有点大….
0 0
- PHP篇之二个函数解决约瑟夫环问题
- php解决约瑟夫环问题
- php解决约瑟夫问题
- PHP解决约瑟夫环的问题
- php解决约瑟夫环
- php 解决 约瑟夫环
- 使用php解决约瑟夫问题
- 约瑟夫环之二(用递归的思想解决Josephus问题)
- PHP约瑟夫环问题
- 约瑟夫环之二
- 约瑟夫问题(php数组方式解决)
- 解决下约瑟夫环问题
- 数组解决约瑟夫环问题
- 数组解决约瑟夫环问题
- 约瑟夫环问题的解决
- 约瑟夫环问题[已解决]
- C# 解决约瑟夫环问题
- 约瑟夫环问题研究(二)
- 流量控制与拥塞控制区别
- python数组的赋值和拷贝
- nginx 初学者指引
- 1619-7 张良 十二月十七号总结 [连续第七十八天]
- 4-7 在一个数组中实现两个堆栈
- PHP篇之二个函数解决约瑟夫环问题
- c语言数据结构实现-链式队列
- 字符串函数
- Ubuntu JDK环境配置
- poj 2528
- 斜杠(/)和反斜杠(\)
- APIJSON, 让接口见鬼去吧!
- [半闲之人] 关于SteamVR摄像机和普通摄像机冲突的解决办法
- Mysql导入数据load data infile用法