丢手帕问题即约瑟夫问题的PHP解法
问题描述:n个人排成一圈。从某个人开始,依次报数,数到m的人被杀死。下一个人重新从1开始报数,数到m的人被杀死。直到剩下最后一个人。
解决思路:从数学角度去看,每一次报数决定谁去死是一个n、m的求余数过程。从程序角度看,玩家和编号一一对应,每一次报数玩家减少一个,编号重新排列。
程序:
1.首先声明相关变量
$childAmount = 6; //总人数
$endNumber = rand(1,6); //死亡编号取随机值
$gameNumber = 0;//游戏次数
$childArray = array('a','b','c','d','e','f');//玩家姓名数组
$playArray = array();//编号姓名对应关系数组
$killArray = array();//死亡顺序名单数组
//初始化
shuffle($childArray);//取随机排序
2.游戏开始前数组准备
//初始化
shuffle($childArray);//取随机排序
//构建关联数组
for($i=0;$i<count($childArray);$i++){
$playArray[$i+1] = $childArray[$i];
}
echo '<pre>';
echo "玩家数:".$childAmount."死亡编号:".$endNumber."<br>";
echo "这是初始游戏编号:";
print_r($playArray);
echo '</pre>';
3.游戏开始
//死亡循环
while($childAmount > 1){//判断人数是否大于1,决定游戏是否结束
$number = $endNumber % $childAmount;//求取余数
//当余数为0时,死亡的是编号最大的人
if($number == 0){
$killArray[] = $playArray[$childAmount];//加入死亡名单
unset($playArray[$childAmount]);//该玩家死亡
$childAmount -= 1;//游戏人数减一
$gameNumber += 1;//死亡循环次数加一
}else{//余数不为0,死亡的是编号等于余数的人
$temp = array();
$killArray[] = $playArray[$number];
unset($playArray[$number]);
//规律:余数不为0,大于以及小于该余数的编号之后的人编号从1开始重新排列。大于该编号的人编号为(本身编号-死亡编号),小于该编号的人编号为(本身编号+当前最大编号-死亡编号)
foreach($playArray as $key => $value){
if($key > $number){
$temp[$key-$number] = $value;
}else{
$temp[$key+$childAmount-$number] = $value;
}
}
ksort($temp);//按键名排序
$playArray = $temp;
$childAmount -= 1;
$gameNumber += 1;
}
if($childAmount == 1){
echo '<pre>';
echo '幸存者是:';
print_r($playArray);
echo '</pre>'; }
}
echo '<pre>';
echo "死亡顺序:";
print_r($killArray);
echo '</pre>';
丢手帕问题即约瑟夫问题的PHP解法的更多相关文章
- 丢手帕问题 (约瑟夫问题)Java实现
问题: 丢手帕游戏是约瑟夫问题的一个变种,游戏很简单,N个小孩围成一个圈,标号为1到N,从编号为m的小孩开始报数,报到第L个小孩退出游戏,然后下一个小孩继续从1开始报数,数到第L个小孩退出游戏,如此循 ...
- 丢手帕问题(环形链表)---Java 待优化
/** * * @author Administrator * 功能:丢手帕问题 */ package com.litao; public class Demo4 { /** * @param arg ...
- java丢手帕 约瑟夫问题
一.问题描述: n个人围成一个圈,编号为1~n,从第一号开始报数,报到3的倍数的人离开,一直数下去,直到最后只有一个人,求此人编号. 二.问题提示: 使用一维数组,数组元素初始为1,从1开始 ...
- 约瑟夫环形链表问题、丢手帕问题、剑指offer圆圈中最后一个数问题
public class Solution { // 左神解法,本题本质还是报数为m-1的倍数的人死.求最后一个活着的人是初始时候的哪个人 /* 报数(A) 实际人员编号(B) ...
- 丢手绢问题(约瑟夫问题)的python实现
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉. def fnA(p, personNum, cnt): times = cnt // pe ...
- 丢手帕问题as3版
N个孩子围成一圈报数,报到M的退出,剩下的再从1继续报数,报到M的再退出,一直持续到只剩一个人,问剩下的是哪个? package { import flash.display.Sprite; publ ...
- java面向对象编程--Josephu问题(丢手帕问题)
Josephu问题为:设编号为1,2,...n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推 ...
- 简洁之美 -约瑟夫环的python 解法
问题描述: 约瑟夫环问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到k的那个人出列:他的下一个人又从1开始报数,数到k的那个人又出列:依此规律重复下 ...
- 韩顺平_linux_随堂笔记
这还是自己3年前(2011年)整理的笔记,记得当时那会儿自己对Linux还特别的憧憬,也很喜欢韩老师的讲课风格,边看边做笔记乐此不彼,现在开通了技术博客,所以把当年的笔记也放上来和大家分享.同时推荐没 ...
随机推荐
- Tomcat 知识点
Tomcat(重点) Tomcat是一个符合于Java EE Web标准的最小web容器,所有的jsp程序一定需要有WEB容器的的支持才可以运行,而且在给定的WEB容器里面会支持事务处理操作. Tom ...
- PHP收藏
PHP打印测试,PHP调试技巧 PHP header函数使用大全 PHP面向对象(OOP)编程入门教程 小片段: PHP保留2位小数 格式化小数.浮点数 header('Content-T ...
- vim 添加php自动补全 并格式化代码
自动补全,修改/etc/vimrc的配置 vim /etc/vimrc 添加: filetype plugin on autocmd FileType php set omnifunc=phpcomp ...
- 第四篇 基于.net搭建热插拔式web框架(RazorEngine实现)
在开头也是先给大家道个歉,由于最近准备婚事导致这篇文章耽误了许久,同时也谢谢老婆大人对我的支持. 回顾上篇文章,我们重造了一个controller,这个controller中用到了视图引擎,我们的视图 ...
- BZOJ 3784: 树上的路径
Description 问一棵树上前 \(k\) 大路径的边权. Sol 边分治. 非常感谢数据没有菊花图. 为了写写边分治试试然后就开了这道题. 边分治非常好想,选一条重边,分成两部分,然后分别求最 ...
- svn检出项目
第一步: 第二步: 第三步: 第四步: 第五步: 填写项目名称 第六步: 选择路径 第七步:
- linux下编译gcc6.2.0
linux下编译gcc6.2.0 在archlinx的下gcc已经更新到6.2.1了,win10的WSL下还是gcc4.8.官方源没有比较新的版本,于是自己编译使用. GCC6的几个新特性 GCC 6 ...
- C# 程序异常管理方案
C# 程序异常管理方案 1.程序出现未处理异常(程序中未捕获异常.添加异常处理) 2.程序添加全局异常捕获 tip:程序已处理异常不在捕获范围内. /// <summary> /// 应用 ...
- mysqldump和xtrabackup备份原理实现说明
背景: MySQL数据库备份分为逻辑备份和物理备份两大类,犹豫到底用那种备份方式的时候先了解下它们的差异: 逻辑备份的特点是:直接生成SQL语句,在恢复的时候执行备份的SQL语句实现数据库数据的重现. ...
- linux下php-mysql拓展安装
今天遇到一个奇怪的问题: 在服务器A上部署应用,在服务器B上部署数据库和缓存. 服务器A:apache2.2,php5.3 服务器B:mysql5.5,redis2.4 问题现象: 本地远程连接服务器 ...