猴子选大王(约瑟夫问题)JAVA实现

问题

	猴子选大王,假设有M个猴子围成一圈,从1开始报数,数到N的猴子退出,最后剩下的猴子就是大王,
	写出程序求出最后是大王的那只猴子最初的位置。
解题分析:
	这道题很明显是约瑟夫问题,对于这样的问题,习惯的是对于每个做标记,然后改变标记。
代码:
package cocalar;

import java.util.Scanner;

public class Monkey {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//定义猴子总数,和被踢出猴子是第几个
		int n;
		int number;

		//输入猴子数量
		Scanner cc = new Scanner(System.in);
		System.out.println("请输入一共多少个猴子");
		n = cc.nextInt();
		System.out.println("请输入数到第几个猴子开始退出");
		number = cc.nextInt();

		//初始化,把所有的猴子先标记为1
		int[] a = new int[n];
		for(int i = 0; i < a.length; i++)
		{
			a[i] = 1;
		}

		int leftCount = 15;		//剩余猴子的数量
		int countNum = 0; 		//目前数到了第几个
		int index = 0;    		//定义当前的位置从0开始。

		//如果当前点的左边数量不为1的话
		//把踢出的猴子标记改为0,未被踢出的不变,依然万为1
		while(leftCount != 1){

			if(a[index] == 1)
			{
				//如果当前剩余猴子的数量大于1,然后标记还为1,那么就在计数器中加1
				countNum++;

				//计数器的数和设定被踢出的猴子的数目相同的时候,踢出猴子,把标记改为0
				if(countNum == number){
					countNum = 0;           //刷新计数器,初始化为0
					a[index] = 0;           //改变当前的标记为0
					leftCount--; 			//在剩余的猴子里面减一
				}
			}

			index ++;       //改变当前的位置
			//改变现有猴子的长度
			//当走到了末尾,转到第一个位置
			if(index == a.length){
				index = 0;
			}
		}

		//从第一个到最后一个查找哪个的标记是0,如果是0的话说明被踢出,如果是1的话,则为剩余的猴王
		for(int i = 0; i < a.length; i++){
			if(a[i] == 1){
				System.out.println("第" + (i+1)+ "只猴子被选为大王!");
			}
		}
	}
}


还有一种数学的解法:
http://blog.csdn.net/u012965373/article/details/17076929
				
时间: 2024-08-02 23:27:26

猴子选大王(约瑟夫问题)JAVA实现的相关文章

猴子选大王(约瑟夫环)

问题: 设编号为1,2,-,n的n个人围坐一圈(每个人有一个密码(正整数)),约定编号为k(1<=k<=n)的人从1开始报数,报到m的那个人出列,将他的密码作为新的m值,他的下一位开始重新从1报数.以此类推,直到所有人全部出列,计算出列顺序? 解决思路: 循环链表 代码: 1 <?php 2 /** 3 * 设编号为1,2,-,n的n个人围坐一圈(每个人有一个密码(正整数)), 4 * 约定编号为k(1<=k<=n)的人从1开始报数,报到m的那个人出列, 5 * 将他的密码作

猴子选大王

M只猴子要选大王,选举办法如下:所有猴子按1,2--n编号围成一圈,从第一号开始顺序报数1,2--m,凡是报m号的退出圈外,如此循环报数直到圈内只剩一只猴子时这只猴子就是大王. 数据结构: 猴子链表,循环    猴子属性值:判断是否落选 利用单向循环链表模拟此过程,输出选出的大王编号. 程序的设计思想: (1)问题分析:"猴子选大王"问题是约瑟夫环问题的一个特例.由于本题目的数据元素个数不可知,所以可使用链表来动态的分配内存空间.而该问题又是一个不断的循环问题所以用循环链表来实现. (

数据结构实践——猴子选大王

本文针对数据结构基础系列网络课程(2):线性表的实践项目. [项目 - 猴子选大王] 一群猴子,编号是1,2,3 -m,这群猴子(m个)按照1-m的顺序围坐一圈.从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王.输入m和n,输出为大王的猴子是几号. 提示: (1)链表解法:可以用一个循环单链表来表示这一群猴子.表示结点的结构体中有两个成员:一个保存猴子的编号,一个为指向下一个人的指针,编号为m的结点再指向编号为1的结点,以此构成环形的链.

数组-11. 猴子选大王(20)

数组-11. 猴子选大王(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 徐镜春(浙江大学) 一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1-N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数.如此不断循环,最后剩下的一只猴子就选为猴王.请问是原来第几号猴子当选猴王? 输入格式: 输入在一行中给一个正整数N(<=1000). 输出

数据结构实践——猴子选大王(数组版)

本文针对数据结构基础系列网络课程(5): 数组与广义表的实践项目. [项目 - 猴子选大王(数组版)] 一群猴子,编号是1,2,3 -m,这群猴子(m个)按照1-m的顺序围坐一圈.从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,最后一只出圈的猴子为大王.输入m和n,输出猴子离开圈子的顺序,从中也可以看出最后为大王是几号猴子. 要求采用数组作为存储结构完成. [参考解答1] 在一个数组中,数组中用1表示猴子在圈中,用0表示猴子已经出圈,数组下标对应与猴子编号对应(例如数组元素p[0

数组-11. 猴子选大王

数组-11. 猴子选大王(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 徐镜春(浙江大学) 一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1-N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数.如此不断循环,最后剩下的一只猴子就选为猴王.请问是原来第几号猴子当选猴王? 输入格式: 输入在一行中给一个正整数N(<=1000). 输出

sicily 猴子选大王

题目描述 猴子选大王,有N只猴子,从1-N进行编号.它们按照编号的顺时针方向,排成一个圆圈,然后从第一只猴子开始报数.第一只猴子报1,以后每只猴子报的数字都是它前面猴子所报数字加1.如果一只猴子报的数字是M,则该猴子出列,下一只猴子重新从1开始报数.剩下的猴子继续排成一个圆圈报数,直到全部的猴子都出列为止.最后一个出列的猴子胜出. 输入格式 The first line is an integer t, indicating the number of test cases. Then ther

7-28 猴子选大王(20 分)

7-28 7-28 猴子选大王(20 分) 一群猴子要选新猴王.新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号.从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数.如此不断循环,最后剩下的一只猴子就选为猴王.请问是原来第几号猴子当选猴王? 输入格式: 输入在一行中给一个正整数N(≤1000). 输出格式: 在一行中输出当选猴王的编号. 输入样例: 11 输出样例: 7 AC代码 #include<stdio.h> int

谁买单,猴子选大王等类似题目不同解法!!!

题目描述 三五好友,相邀畅谈,围一圆桌,饭后报数,以决买单.从第一个人开始报数(从1到3报数)凡报到3的人就不用买单,退出圈子.问最后留下要买单的是原来第几号的人. 输入 多组测试数据,输入整个n( n < 50 ),表示n个人. 输出 输出买单的人. 样例输入 8 样例输出 7---------------------------------------------------------------------------------------------题目比较简单,就是把一个个的数组找