找出大王的问题

有n只猴子围城一个圈,从第1只猴子开始数,每数m只猴子将第当前猴子踢出,如此反复,最后剩下一只猴子就是大王。

/**
* @name king
* @param int m 间隔数
* @param int n 猴子总数
*/
function king(m, n){
/**
queue
{
p:int, //前一只猴子
n:int //后一只猴子
}
*/
var p = {};
p[n] = {
p:n-1,
n:1
};
p[1] = {
p:n,
n:2
};
for(var i=2;i<n;i++){
p[i] = {
p:i-1,
n:i+1
}
};

var i = 0;
var cursor = 1;//cursor
var _n = _p = 0;

while(++i){

if(i==m){
_n = p[cursor].n;
_p = p[cursor].p;
delete p[cursor]; //删除
if(p[_p]==undefined)break;//如果没有下一只猴子即找到了
p[_p].n = _n;
p[_n].p = _p;
cursor = _n;
i = 0;
}else{
cursor = p[cursor].n;
};

};
alert("The king is \r\n"+cursor);

};

抛砖引玉,希望有更好的算法。

posted @ 2012-04-03 12:09  老西  阅读(157)  评论(0编辑  收藏  举报