约瑟夫问题(丢手帕问题)
/**
* 作者:徐守威
* 功能:约瑟夫问题(丢手帕问题)
* 具体问题:设编号为1,2,3....n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始
* 报数,数到m的那个人出列,它的下一位从一开始报数,报到m的那个人又出列,以此类推,
* 直到所有人出列为止,如此产生一个出列编号的序列...
* 解决方案:链表
*/
package com.jasxu;
import java.io.*;
public class T4 {
/**
* @param args
*/
public static void main(String[] args){
// TODO Auto-generated method stub
try
{
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
System.out.println("请输入参加该游戏小孩的个数:");
String joinNmu=br.readLine();
System.out.println("请输入您想从编号为几的小孩开始报数?");
String n1=br.readLine();
System.out.println("请输入您想数到几的小孩出列?");
String n2=br.readLine();
int num1=Integer.parseInt(n1);
int num2=Integer.parseInt(n2);
int joinLen=Integer.parseInt(joinNmu);
CycLink cyclink=new CycLink();
cyclink.setLen(joinLen);
cyclink.createLink();
cyclink.setK(num2);
cyclink.setM(2);
cyclink.show();
cyclink.play();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
//构建各个孩子
class Child
{
//定义child的编号
int no;
//定义可以指向下一个的指针
Child nextChild=null;
//创建构造函数
public Child(int no)
{
//赋编号
this.no=no;
}
}
//构建一个环形链表
class CycLink
{
//先定义一个指向链表第一个小孩的引用
//指向第一个小孩的引用,不能动
Child firstChild=null;
//定义一个游标,相当于跑龙套
Child temp=null;
//定义一个表示大小的的len,表示共有几个小孩
int len=0;
int k=0;
int m=0;
//构造函数,用来设置环形链表的大小
public void setLen(int len)
{
this.len=len;
}
//设置m的值
public void setM(int m)
{
this.m=m;
}
//设置从第几个人开始数数
public void setK(int k)
{
this.k=k;
}
//游戏实现
public void play()
{
//设置跑龙套的小孩
Child temp=this.firstChild;
//1.找到开始数数的人
for(int i=1;i<k;i++)
{
temp=temp.nextChild;
}
while(this.len!=1)
{
//2.数m下
for(int j=1;j<m;j++)
{
temp=temp.nextChild;
}
//3.找到要出圈的前一个小孩
//定义一个2号跑龙套的人
Child temp2=temp;
while(temp2.nextChild!=temp)
{
temp2=temp2.nextChild;
}
//4.数完了过后将数到m的小孩退出圈
temp2.nextChild=temp.nextChild;
//让temp指向下一个数数的小孩
temp=temp.nextChild;
this.len--;
}
//输出最后一个小孩
System.out.println("最后出圈的小孩是:"+temp.no+"号小孩!");
}
//初始化环形链表
public void createLink()
{
//统计有多少个孩子
for(int i=1;i<=len;i++)
{
if(i==1)
{
//首先创建第一个小孩
Child ch=new Child(i);
//将第一个孩子的应用交给firstChild
this.firstChild=ch;
//同时也要将引用交给跑龙套用
this.temp=ch;
}
else
{
//判断是否是创建最后一个小孩
if(i==len)
{
//继续创建小孩
Child ch=new Child(i);
//将temp的指针指向下一条地址的引用
temp.nextChild=ch;//这条线相当于搭桥的线
//桥答完后还要让temp指向刚刚创建的那个孩子
temp=ch;
//最后一个小孩的指针应指向头一个地址的引用
temp.nextChild=this.firstChild;
}
else
{
//继续创建小孩
Child ch=new Child(i);
//将temp的指针指向下一条地址的引用
temp.nextChild=ch;//这条线相当于搭桥的线
//桥答完后还要让temp指向刚刚创建的那个孩子
temp=ch;
}
}
}
}
//打印该环形链表
public void show()
{
//定义一个跑龙套
Child temp=this.firstChild;
do
{
System.out.print(temp.no+" ");
temp=temp.nextChild;
}while(temp!=this.firstChild);
}
}
转载于:https://www.cnblogs.com/Jasxu/p/3529753.html
约瑟夫问题(丢手帕问题)相关推荐
- 约瑟夫问题,即丢手帕游戏
/** @author sunqian @time 2015.1.27 @功能 约瑟夫(丢手帕)问题 @描述 n个小孩围坐,从k位小孩开始开始约定一个数m并开始轮流报数,数到m的小孩出列直到列表为空, ...
- 丢手帕问题(约瑟夫问题)
设编号为1,2,n的n个人围坐一圈,约定编号为K(1=<K<=n)的人从1开始报数,数到m的人出列,她的下一位又从1开始报数,数到m的人又出列,以此类推直到所有人都出列,由此产生一个出队序 ...
- 丢手帕程序C语言,约瑟夫问题,即丢手帕游戏
/** @author sunqian @time 2015.1.27 @功能 约瑟夫(丢手帕)问题 @描述 n个小孩围坐,从k位小孩开始开始约定一个数m并开始轮流报数,数到m的小孩出列直到列表为空, ...
- 约瑟夫问题的理解与解决(丢手帕问题)
又到了面试题的总结手机,下面让我们来看看如何理解与求解约瑟夫问题吧! 什么是约瑟夫问题? 简单来讲(小编个人理解):一堆人想要选择一个人来做事情(需要多个人),就选择一个数,排序到这个数的人去做这件事 ...
- 丢手帕java_java基于双向环形链表解决丢手帕问题的方法示例
本文实例讲述了java基于双向环形链表解决丢手帕问题的方法.分享给大家供大家参考,具体如下: 问题:设编号为1.2--n的几个小孩围坐一圈,约定编号为k(1= 我们现在用一个双向环形链表来解这一问题. ...
- 丢手帕问题 java_丢手帕问题,java实现
今天偶然发现一个很经典的算法问题:丢手帕问题.问题的具体描述是:N个人围成一圈,然后从第A个人开始报数(报数从1开始).报数为B的人出列,然后后面的人从新开始报数,请问,最后一个人是多少号. 刚开始觉 ...
- 丢手帕问题 java_java基于双向环形链表解决丢手帕问题的方法示例
导读热词 本文实例讲述了java基于双向环形链表解决丢手帕问题的方法.分享给大家供大家参考,具体如下: 问题:设编号为1.2--n的几个小孩围坐一圈,约定编号为k(1= 我们现在用一个双向环形链表来解 ...
- 丢手帕问题 java_丢手帕问题 (java实现)
/** *@author zhouhong *@fuction:丢手帕问题 */ package com.zhouhong10; import com.zhouhong10.*; public cla ...
- 约瑟夫问题(丢手帕问题)的java实现
约瑟夫问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉.例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3.最后剩下1号.借用一些自己感兴趣的球星的名字,使 ...
最新文章
- 软件性能测试主要看什么指标
- 当Swin Transformer遇上DCN,效果惊人!
- 1501 二叉树最大宽度和高度
- MySql 内存表使用
- java版苹果免签源码超级签名免签源码
- jquery easyui Tab 引入页面的问题
- Silverlight Blend动画设计系列三:缩放动画(ScaleTransform)
- Javascript中最常用的经典技巧
- php生成透明png图像 无锯齿
- Python 过滤a文件中每一行内容,保存到b文件中
- 微信小程序 js 正则校验车牌号 车牌号校验
- IPFS是创建DWeb应用程序中基础技术的领先者
- P1137【旅行计划】
- java word 图片_java导出word(带图片)
- 融云首席科学家任杰:写在融云 8 周年
- 幼儿园计算机认识键盘上课教案,认识键盘教案
- 为什么这么多学生讨厌数学(以及如何解决它)?
- 在线文字生成音频工具
- 计算机职业资格证书的权威部门是哪个部门?
- 巴菲特50年投资之道