丢手帕问题(约瑟夫问题)
设编号为1,2,n的n个人围坐一圈,约定编号为K(1=<K<=n)的人从1开始报数,数到m的人出列,她的下一位又从1开始报数,数到m的人又出列,以此类推直到所有人都出列,由此产生一个出队序列。
分析:用一个不带头结点的循环列表处理:先构成一个有n个节点的单循环链表,然后从K节点开始计数,记到m时,对应节点从链表中删除,然后在从被删除节点的下一个节点又从一开始计数,直到最后一个节点从链表中被删除。
/**
* 功能:丢手帕问题(约瑟夫)
*/
package com.lin;
public class Demo4 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Cyclink cyclink=new Cyclink();
cyclink.setlen(5);
cyclink.createlink();
cyclink.setk(2);
cyclink.setm(2);
cyclink.show();
cyclink.play();
}
}
class Child{
int no;
Child nextchild=null;
public Child(int no){
this.no=no;
}
}
//环形链表
class Cyclink{
//先定义一个指向链表第一个小孩的引用
//指向第一个小孩的引用不能动
Child firstchild=null;
//一直动的变量
Child temp=null;
int len=0;//表示共有几个小孩
int k=0;
int m=0;
//设置链表大小
public void setlen(int len){
this.len=len;
}
//设置从第几个人开始数
public void setk(int k){
this.k=k;
}
//设置m
public void setm(int m){
this.m=m;
}
//开始play
public void play(){
temp=this.firstchild;
//1.先找到开始数数的人
for (int i=1;i<k;i++){
temp=temp.nextchild;//temp指向了应该被删除的人
}
while(this.len!=1){
//2.数 m下
for (int j=1;j<m;j++){
temp=temp.nextchild;
System.out.print("第"+j+"个出圈的小孩次序"+temp.no+" ");
}
//找到出圈小孩的前一个小孩
Child temp2=temp;
while(temp2.nextchild!=temp){
temp2=temp2.nextchild;
}
//3.数到m的人,删除
//temp2是每次出圈的前一个小孩,
//temp是每次出圈的后一个小孩
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);
this.firstchild=ch;
this.temp=ch;
}else
{ //创建最后一个小孩
if (i==len){
//继续创建小孩
Child ch=new Child(i);
temp.nextchild=ch;
temp=ch;
temp.nextchild=this.firstchild;
}
else{
//继续创建小孩
Child ch=new Child(i);
temp.nextchild=ch;//第一个小孩指向第二个,搭一条线
temp=ch; //temp也随着走一个,指向刚进来的小孩
}
}
}
}
//打印该环形链表
public void show(){
//定义一个跑龙套
Child temp=this.firstchild;
do{
System.out.print(temp.no+" ");
temp=temp.nextchild;
}while(temp!=this.firstchild);
}
}
丢手帕问题(约瑟夫问题)相关推荐
- 约瑟夫问题(丢手帕问题)
/** * 作者:徐守威 * 功能:约瑟夫问题(丢手帕问题) * 具体问题:设编号为1,2,3....n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始 * 报数,数到m的那个 ...
- 丢手帕程序C语言,约瑟夫问题,即丢手帕游戏
/** @author sunqian @time 2015.1.27 @功能 约瑟夫(丢手帕)问题 @描述 n个小孩围坐,从k位小孩开始开始约定一个数m并开始轮流报数,数到m的小孩出列直到列表为空, ...
- 约瑟夫问题的理解与解决(丢手帕问题)
又到了面试题的总结手机,下面让我们来看看如何理解与求解约瑟夫问题吧! 什么是约瑟夫问题? 简单来讲(小编个人理解):一堆人想要选择一个人来做事情(需要多个人),就选择一个数,排序到这个数的人去做这件事 ...
- 约瑟夫问题,即丢手帕游戏
/** @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号.借用一些自己感兴趣的球星的名字,使 ...
最新文章
- python零基础入门教材-Python零基础入门到精通自学视频教程
- 【算法】快速排序与归并排序对比
- 2年Java面试提问总结
- linux安装java_linux中替换系统自带的OpenJDK
- 今天学了瀑布流的js方法
- POJ - 2828 Buy Tickets(线段树+思维/Splay+模拟)
- word文档下划线无法显示的解决方法
- Web前端面试指导(十四):如何居中一个元素(正常、绝对定位、浮动元素)?
- 保存远程图片到本地 同时取得第一张图片并创建缩略图
- 【基础知识】~ 集成电路设计流程,以及各阶段所使用的EDA工具
- 基于51单片机和GPS的经纬度时间速度航向系统设计定位电子罗盘原理图程序设计
- Egert实现五点连线(创意参考:网易爱的不同定义)[附源码]
- chm 打不开 解决办法
- 。快充的原理有三种:电压不变、提升电流,电流不变,提升电压,电流电压两者都提高。要想达到这三种方式的其中一种,我们都需要对充电头和充电线进行掌控。
- [ROS] KDL + DH 参数 + 正解
- htc升级鸿蒙,HTC手机卡刷教程,固件升级教程
- windows11正式版官方系统原版镜像下载: Win11 21H2 Build 22000.613发布
- cancase vector_vector CANcase 1630
- 可乐瓶游戏c语言,中班协调性体育游戏—玩可乐瓶
- 怎么修改代码文件创建时间