猴子选大王
循环链表解法
题目:n只猴子要选大王,选举方法如下:所有猴子按1,2,…,n编号并按照顺序围成一圈,从第k个猴子起,由1开始报数,报到m时,该猴子就跳出圈外,下一只猴子再次由1开始报数,如此循环,直到圈内剩下一只猴子时,这只猴子就是大王。
- 输入数据:猴子总数n,起始报数的猴子编号k,出具数字m。
- 输出数据:猴子的出队序列和猴子大王的编号。
问题问得是相当多了,也见过有很多简化过的问题,比如固定起始报数的猴子编号为1等等。
利用循环链表是个容易理解的解法,但当数据较大时,这种算法的时间复杂度也变得很大。约瑟夫环的时间复杂度会更小一点,但是只能得出最后留下的人,也就是猴王,无法得出出队序列。
import java.util.Scanner;
public class KingOfMonkey
{
public static void main(String[] args)
{
boolean list[]=new boolean[50];//存放猴子的数组
Scanner in=new Scanner(System.in);
System.out.println("请输入猴子的总数:");
int n=in.nextInt();
System.out.println("请输入起始报数的编号:");
int k=in.nextInt();
System.out.println("请输入出局数字:");
int m=in.nextInt();
in.close();
int i,j,count=0,total=n;//报数count置零,总数total为n
for(i=1;i<=n;i++)//给n个猴子置初始状态 true
list[i]=true;
for(i=k;i<=n;i++)
{
if(list[i]==true)//猴子还活着
{
count++;
}
if(count==m)//杀死猴子
{
total--;
list[i]=false;
System.out.println(i+"号猴子淘汰!");
count=0;
}
if(total==1)
{
for(j=1;j<=n;j++)
{
if(list[j]==true)
System.out.println("猴王诞生!他就是"+j+"号猴子!");
}
System.exit(0);
}
if(i==n)
i=0;
}
}
}
博客围绕猴子选大王问题展开,该问题是n只猴子编号围成圈,从第k个起报数,报到m的猴子出圈,直至剩一只为大王。介绍了输入输出数据,提到常见简化问题。还指出循环链表解法易理解,但数据大时时间复杂度高,约瑟夫环复杂度小,却只能得猴王编号。
6622

被折叠的 条评论
为什么被折叠?



