数组实现猴子选大王问题(C语言)

问题描述:n只猴子要选拔大王(n不超过50),将这些猴子按照顺序编号,从1到n。从第一只猴子开始从1依次报数,报到数字为m的猴子淘汰,从这只猴子的下一只开始再次从1依次报数,报到m的猴子离开。直到最后剩下的猴子当选大王。

问题分析:可知每一只猴子有两种状态,备选或者淘汰。刚开始时所有猴子状态都是备选,当猴子报数到m后,这只猴子的状态就转变为淘汰。到最后只有一只猴子的状态是备选,即这只猴子当选。可以通过控制猴子的状态找出当选的猴子。

以下是代码实现:

#include <stdio.h>
#define N 50
int main()
{
	int  s=0, m,n,num,bh=0,i;
	static int a[N];    //将数组中所有元素赋值0,0代表备选
	scanf("%d%d", &n, &m);
	for (num = n; num > 1; ) {      //num代表当前猴子的数量,当猴子数量为1时即找出大王,循环结束
		bh++;       //bh用于记录当前猴子的编号
		if (bh > n)bh = 1;     //当猴子的编号大于猴子初始数目时,回头从1号猴子开始报数
		if (a[bh] == 0) {        
			s++;      //如果猴子的状态是备选,则猴子要进行报数,s为计数器,代表当前猴子报数的数值
			if (s == m) {
				a[bh] = 1;     //如果当前猴子报数数值为m,将这只猴子状态改为淘汰,用1表示
				num--;      //当前猴子的数量减一,因为上一只猴子已被淘汰
				s = 0;      //计数器归为0
			}
		}
	}                            //结束循环后,备选猴子数量减为1
	for (i = 1; i <= n; i++) {
		if (a[i] == 0)printf("%d", i);
	}      //从编号为1的猴子开始,寻找状态为备选的猴子,该猴子当选大王
	return 0;
}

总结:要解决此问题,关键是明白只有状态为备选的猴子才能参与报数,并且设法将猴子的编号与该猴子报数的数值绑定。以上代码通过使用赋值给数组中的元素改变该元素的状态来实现第一个过程,通过计数器s和编号bh实现第二个过程。

如有错误欢迎指正

猜你喜欢

转载自blog.csdn.net/fbzhl/article/details/127340316