丢手帕问题即约瑟夫问题的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还特别的憧憬,也很喜欢韩老师的讲课风格,边看边做笔记乐此不彼,现在开通了技术博客,所以把当年的笔记也放上来和大家分享.同时推荐没 ...
随机推荐
- 为什么我们拿Fork当收藏用
刚才看OSC源创会的视频,听到 @虫虫 说:中国人喜欢拿Fork当收藏用,这对硬盘是个很大的压力.我当时很认真地笑了笑.想想好像自己也Fork了一些东西啊. 是什么因素促使我去Fork一些东西呢?我大 ...
- 【新手出发】从搭虚拟机开始,一步一步在CentOS上跑起来.Net Core程序
文章背景 微软6月26号发布core 1.0版本后,园子里关于这方面的文章就更加火爆了,不管是从文章数量还是大家互动的热情来看,绝对是最热门的技术NO.1.我从去年底开始接触.net core到现在也 ...
- android:clipChildren属性的作用
该属性默认为true,这个属性需要添加到最顶层的ViewGroup,作用是控制子View是否可以超出它所在的父View设定的边界 比如ImageView设置高度100dp,而它所在的父View设置的高 ...
- C++基础知识(5)---类和对象
终于把C++中的基础在前面的几篇博客中总结完了,可能还有一些语法还没有总结到,没关系,以后用到了再查资料就好.类是C++中的一个非常重要的概念,这是区别你使用的C++到底是面向过程还是面向对象的一个重 ...
- Python复习之生成器 generator
生成器 generator def h(): print "hello" m = yield 5 print "m:", m d = yield 12 prin ...
- 在Xcode5中修改整个项目名
总会遇到几个项目,在做到一半的时候被要求改项目名,网上找了下相关的资料,大多数是xcode5以前的版本,所以解决好了在这里mark一下,给需要的人. 目标为:将项目名XCD4改成xcd5. 先上结果图 ...
- html5 json的新用法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- connect mysql from another host
vim /etc/mysql/my.cnf bind-address = 0.0.0.0 /etc/init.d/mysql restart mysql -uroot -p1234 # grant a ...
- [MySQL]MySQL之权限管理
一.MySQL权限简介 关于mysql的权限简单的理解就是mysql允许你做你全力以内的事情,不可以越界.比如只允许你执行select操作,那么你就不能执行update操作.只允许你从某台机器上连接m ...
- How to Fix GNOME License Not Accepted Issue on CentOS 7
This post assume that you have just finished the Gnome GUI installation on CentOS 7 by using “yum gr ...