问题描述: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解法的更多相关文章

  1. 丢手帕问题 (约瑟夫问题)Java实现

    问题: 丢手帕游戏是约瑟夫问题的一个变种,游戏很简单,N个小孩围成一个圈,标号为1到N,从编号为m的小孩开始报数,报到第L个小孩退出游戏,然后下一个小孩继续从1开始报数,数到第L个小孩退出游戏,如此循 ...

  2. 丢手帕问题(环形链表)---Java 待优化

    /** * * @author Administrator * 功能:丢手帕问题 */ package com.litao; public class Demo4 { /** * @param arg ...

  3. java丢手帕 约瑟夫问题

    一.问题描述:     n个人围成一个圈,编号为1~n,从第一号开始报数,报到3的倍数的人离开,一直数下去,直到最后只有一个人,求此人编号. 二.问题提示:  使用一维数组,数组元素初始为1,从1开始 ...

  4. 约瑟夫环形链表问题、丢手帕问题、剑指offer圆圈中最后一个数问题

    public class Solution { // 左神解法,本题本质还是报数为m-1的倍数的人死.求最后一个活着的人是初始时候的哪个人       /* 报数(A) 实际人员编号(B)      ...

  5. 丢手绢问题(约瑟夫问题)的python实现

    约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉. def fnA(p, personNum, cnt): times = cnt // pe ...

  6. 丢手帕问题as3版

    N个孩子围成一圈报数,报到M的退出,剩下的再从1继续报数,报到M的再退出,一直持续到只剩一个人,问剩下的是哪个? package { import flash.display.Sprite; publ ...

  7. java面向对象编程--Josephu问题(丢手帕问题)

    Josephu问题为:设编号为1,2,...n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推 ...

  8. 简洁之美 -约瑟夫环的python 解法

    问题描述: 约瑟夫环问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到k的那个人出列:他的下一个人又从1开始报数,数到k的那个人又出列:依此规律重复下 ...

  9. 韩顺平_linux_随堂笔记

    这还是自己3年前(2011年)整理的笔记,记得当时那会儿自己对Linux还特别的憧憬,也很喜欢韩老师的讲课风格,边看边做笔记乐此不彼,现在开通了技术博客,所以把当年的笔记也放上来和大家分享.同时推荐没 ...

随机推荐

  1. 预处理指令#pragma

    #pragma介绍 #pragma是一个预处理指令,pragma的中文意思是『编译指示』.它不是Objective-C中独有的东西(貌似在C/C++中使用比较多),最开始的设计初衷是为了保证代码在不同 ...

  2. JSP页面元素构成

    1.page指令 <%@ page 属性1="" 属性2="" 属性3=""> <%@ page language=&qu ...

  3. NFS配置(centos)

    一.简介    NFS(Network File System/网络文件系统):       1).设置Linux系统之间的文件共享(Linux与Windows中间文件共享采用SAMBA服务): 2) ...

  4. 购物车相关 js

    <div class="caigou"> <form action="" method="post"> <di ...

  5. PYTHON 写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者

    def a3(arg): ret = [ ] for i in range(len(arg)): if i % 2 == 1: ret.append(arg[i]) else: pass return ...

  6. Unity 碰撞的例子

    1.新建一个3D的Unity工程. 2.菜单 "GameObject" - "3D Object",选择"Cube" 和 "Cap ...

  7. cf591d

    题意:给出船的最大速度v,起点,终点.风在前t秒是一个方向,t秒后就一直是第二个方向.两个方向已知. 船速永远大于风速.问船在自由掌握速度和行驶方向的情况下,最快多久到终点. 分析:首先排除一种方法, ...

  8. caffe_实战之两个简单的例子(物体分类和人脸检测)

    一.物体分类: 这里使用的是caffe官网中自带的例子,我这里主要是对代码的解释~ 首先导入一些必要的库: import caffe import numpy as np import matplot ...

  9. C++ Bitstream类

    从raknet上剥下来的 比较适用于前后端通讯,可以对BitStream进行二次封装,方便使用. BitStream.h: #ifndef __BITSTREAM_H #define __BITSTR ...

  10. iOS block

    主要内容: block基本声明格式 block访问区域变量 block代替代理 block基本声明格式: ^(传入的参数){具体代码}; 注: Block实体开头是"^",接着是由 ...