转载请注明出处: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;
}