转载请注明出处:http://blog.csdn.net/u012860063
问题:M只猴子要选大王,选举办法如下:所有猴子按1,2……n编号围成一圈,从第一号开始顺序1,2……m,凡是报m号的退出圈外,如此循环报数直到圈内只剩一只猴子时这只猴子就是大王。
约瑟夫环问题;
回溯法:将猴子总个数循环,每一次循环都是将当前需要出圈的猴子排列到数组的末尾。这样全部猴子循环一遍(逆时针)后,数组头的猴子即为猴王。注意,循环一起找出第一个之后将之循环它之前的剩余数组。即程序中的for(i = n-1 ; i >= 0 ; i--)
代码如下:
第一种:
#include<cstdio> #define MAX 10 int n,m; int Monkey[MAX]; void init() { for(int i = 0 ; i < n ; i++) Monkey[i]=i+1; } int main() { int i , j , k, t; while(~scanf("%d%d",&n,&m)) { init(); for(i = n-1 ; i >= 0 ; i--) { for(k = 1 ; k <= m ; k++) { t=Monkey[0]; for(j = 0 ; j < i ; j++) { Monkey[j]=Monkey[j+1]; } Monkey[i]=t; } } printf("猴王是:第%d只猴子\n",Monkey[0]); } return 0; }
第二种递推:
#include <cstdio> int main() { int n, m; while(~scanf("%d%d",&n,&m)) { int ans = 0; for(int i = 2; i <= n; i++) { ans = (ans+m)%i; } printf("猴王是:第%d只猴子\n",ans+1); } return 0; }