题目是这样的,从网上找到的:
群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。
分析:
用队列来模拟这个问题是比较合适的,编好号的猴子先排成一队,从队头开始往外pop数据,并且同时开始计数,如果计数到了m,把这个猴子直接踢出去,否则就放到队尾,一直不停的出队入队,直到最后一只猴子。
这个问题用c来做一个队列或者直接用数组也是可以解决的。
对php来讲,array本身就是一个双向链表。可以直接用array来解决这个问题,但是php提供的出入队列的api感觉用在这里不太顺手,最后尝试了半天,找到一个还算合理的解决办法
function monkey_select($n, $m) {
//value算是猴子的id,标识是哪只猴子
$queue = range(1, $n);
//相当于一个计数功能
$baoshu = 0;
while(count($queue) > 1) {
$baoshu++;
//弹出第一个元素
$current = array_shift($queue);
if(($baoshu % $m) != 0) {
//报数没有命中m,则排到队尾
$queue[] = $current;
}
}
//输出最后一个元素
$current = array_shift($queue);
echo $current; //echo 5
}
monkey_select(6,4);