经典算法实现(1):猴子选大王

本文介绍了一种通过报数方式选出猴子大王的算法。n只猴子围成一圈,从1号开始顺时针报数,每报到m即淘汰一只,直至剩下最后一只成为大王。使用PHP实现该算法,并通过实例演示了当n=10,m=3时的大王产生过程。

题目描述

n只猴子围坐成一个圈,按顺时针方向从1到n编号。
从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数;
如此重复,直至剩下一个猴子,它就是大王。

实现

  • php语言
<?php 
error_reporting(E_ALL);

$N = isset($_GET['n']) ? $_GET['n'] : 0;//猴子总数
$M = isset($_GET['m']) ? $_GET['m'] : 0;//报数number
if(!$N || !$M){
    echo "Need Params n & m.";
    exit;
}

//猴子排队拿号
$monkey_group = array();
for($i=1;$i<=$N;$i++){
    $monkey_group[] = $i;
}

echo "There are ".count($monkey_group)." Monkeys.<br>";

//猴子围坐
$king_num = 0;
$counter = 0;
while(true){
    $temp = array();
    $L = count($monkey_group);

    if($L == 1){
	//只剩一个则为King
	$king_num = $monkey_group[0];
	break;
    }
    
    //从1到m报数
    for($j=0;$j<$L;$j++){
	$counter++;
	echo "[".$monkey_group[$j]."] : ".$counter;

	if($counter == $M){
	    //报数为m的出列
	    echo " out";
  	    unset($monkey_group[$j]);
	    $counter = 0;

	}else{
	    //其余继续报数
	    array_push($temp,$monkey_group[$j]);
	}
	echo "<br>";
    }

    //新的报数队列
    $monkey_group = $temp;
}

echo "The King Is : NO.".$king_num."<br>";


exit;


传入参数:n=10&m=3
页面打印:
There are 10 Monkeys.
[1] : 1
[2] : 2
[3] : 3 out
[4] : 1
[5] : 2
[6] : 3 out
[7] : 1
[8] : 2
[9] : 3 out
[10] : 1
[1] : 2
[2] : 3 out
[4] : 1
[5] : 2
[7] : 3 out
[8] : 1
[10] : 2
[1] : 3 out
[4] : 1
[5] : 2
[8] : 3 out
[10] : 1
[4] : 2
[5] : 3 out
[10] : 1
[4] : 2
[10] : 3 out
The King Is : NO.4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值