有n个人,编号为1~n,从第一个人开始报数,从1开始报,报到m的人会死掉,然后从第m+1个人开始,重复以上过程。在死了n-1个人后,问最后一个人的编号是?
解法一模拟:
采取一个dead[]数组,每次从一个没有死的人开始,活着的人依次报数(那么需要跳过dead[i]==true的人),到m处那个人去世
同时计数num++ 当杀死num==n-1时,返回dead[]数组中为false的人下标+1
易错点(下标)
解法二递归:
将n个人排开,第m个人奖去世=》子问题为:剩余后面开始(过头继续链接上前面部分)n-1个人的约瑟夫环问题
假设N-1个人最终活下来的人为k,也就是n-1个人中的第k个,那么这个人在原先N个人的位置是:(k+m-1)%n +1
int ysf(int n, int m) {
// write code here
if(n==1)
return 1;
else
return (ysf(n-1,m)+m-1)%n+1;
}
这类递归比较难构想,类似于递归入门问题:汉诺塔问题。将待解决的问题推挪给下一次解决