丢手帕问题即约瑟夫问题的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还特别的憧憬,也很喜欢韩老师的讲课风格,边看边做笔记乐此不彼,现在开通了技术博客,所以把当年的笔记也放上来和大家分享.同时推荐没 ...
随机推荐
- 预处理指令#pragma
#pragma介绍 #pragma是一个预处理指令,pragma的中文意思是『编译指示』.它不是Objective-C中独有的东西(貌似在C/C++中使用比较多),最开始的设计初衷是为了保证代码在不同 ...
- JSP页面元素构成
1.page指令 <%@ page 属性1="" 属性2="" 属性3=""> <%@ page language=&qu ...
- NFS配置(centos)
一.简介 NFS(Network File System/网络文件系统): 1).设置Linux系统之间的文件共享(Linux与Windows中间文件共享采用SAMBA服务): 2) ...
- 购物车相关 js
<div class="caigou"> <form action="" method="post"> <di ...
- PYTHON 写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者
def a3(arg): ret = [ ] for i in range(len(arg)): if i % 2 == 1: ret.append(arg[i]) else: pass return ...
- Unity 碰撞的例子
1.新建一个3D的Unity工程. 2.菜单 "GameObject" - "3D Object",选择"Cube" 和 "Cap ...
- cf591d
题意:给出船的最大速度v,起点,终点.风在前t秒是一个方向,t秒后就一直是第二个方向.两个方向已知. 船速永远大于风速.问船在自由掌握速度和行驶方向的情况下,最快多久到终点. 分析:首先排除一种方法, ...
- caffe_实战之两个简单的例子(物体分类和人脸检测)
一.物体分类: 这里使用的是caffe官网中自带的例子,我这里主要是对代码的解释~ 首先导入一些必要的库: import caffe import numpy as np import matplot ...
- C++ Bitstream类
从raknet上剥下来的 比较适用于前后端通讯,可以对BitStream进行二次封装,方便使用. BitStream.h: #ifndef __BITSTREAM_H #define __BITSTR ...
- iOS block
主要内容: block基本声明格式 block访问区域变量 block代替代理 block基本声明格式: ^(传入的参数){具体代码}; 注: Block实体开头是"^",接着是由 ...