算法:约瑟夫环问题

    xiaoxiao2025-09-30  52

    问题描述:n个人围成一圈,从编号为k的人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,求最后一个出圈的人 

    /* * arr array 值为range(1,总人数) * m int 报号到m的人出圈 * current int 从第current+1 个人开始喊1;值为k-1 * return 返回最后一个人的编号 * */ //所有人从1到n编号,放到一个数组中 function JosephusProblem($arr,$m,$current=0){ $len = count($arr); if($len==1){ return $arr[0]; //只剩一个人时候跳出递归 }else{ $i=1; while($i<$m){ $i++; $current++; $current = $current%$len; //比如,最后剩3人,但m为5;5%3=2 } //从数组中移除元素,并用新元素取代它:array_splice(array,start,length,array) //echo $arr[$current],'  '; //打印每一次报到m号的人 array_splice($arr,$current,1); return JosephusProblem($arr,$m,$current); //开始下一次1到m的报数 } } //所有人从1到n编号,放到一个数组中 $arr = range(1,41); echo JosephusProblem($arr,3,0); //最后的一个人

     

    最新回复(0)