猴子选大王问题(约瑟夫环)

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

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/u012860063/article/details/28281357
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞