java实现丢手绢问题_java编程约瑟夫问题实例分析

2023-10-17 13:59

本文主要是介绍java实现丢手绢问题_java编程约瑟夫问题实例分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介

约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”.)

例子:

len个人围成一个圈,玩丢手绢游戏。从第k个人开始,从1开始数数,当数到m时,数m的人就退出圈子,当圈子只剩下一个人为止。

问题分析与算法设计

约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。这里给出一种实现方法。

题目中len个人围成一圈,因而启发我们用一个循环的链来表示,可以使用结构数组来构成一个循环链。结构中有两个成员,其一为指向第一个孩子的头节点,另一个为作为判断的节点temp(负责跑龙套)。

具体代码如下:

package demo11;

/**

* 约瑟夫问题, 化为丢手绢

*

* @author tianq 思路:建立一个Child类 一个循环列表类CyclLink

*/

public class demo11 {

public static void main(String[] args) {

CyclLink cyclink = new CyclLink();

cyclink.setLen(15);

cyclink.createLink();

cyclink.setK(2);

cyclink.setM(2);

cyclink.show();

cyclink.play();

}

}

// 先建立一个孩子类

class Child {

// 孩子的标识

int no;

Child nextChild;

// 指向下一个孩子

public Child(int no) {

// 构造函数给孩子一个id

this.no = no;

}

}

class CyclLink {

// 先定义一个指向链表第一个小孩的引用

// 指向第一个小孩的引用,不能动

Child firstChild = null;

Child temp = null;

int len = 0;

// 表示共有几个小孩

int k = 0;

//开始的孩子

int m = 0;

//数到几推出

// 设置m

public void setM(int m) {

this.m = m;

}

// 设置链表的大小

public void setLen(int len)

{

this.len = len;

}

// 设置从第几个人开始数数

public void setK(int k) {

this.k = k;

}

// 开始play

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;

}

// 找到要出圈的前一个小孩

Child temp2 = temp;

while (temp2.nextChild != temp) {

temp2 = temp2.nextChild;

}

// 3.将数到m的小孩,退出

temp2.nextChild = temp.nextChild;

// 让temp指向下一个数数的小孩

temp = temp.nextChild;

// this.show();

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;

}

}

}

}

// 打印该环形链表

public void show() {

Child temp = this.firstChild;

do {

System.out.print(temp.no + " ");

temp = temp.nextChild;

}

while (temp != this.firstChild);

}

}

结果:

b208a9f9c48b88685df288242ea77c12.png

总结

以上就是本文关于java编程约瑟夫问题实例分析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

这篇关于java实现丢手绢问题_java编程约瑟夫问题实例分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/225851

相关文章

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

java如何解压zip压缩包

《java如何解压zip压缩包》:本文主要介绍java如何解压zip压缩包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解压zip压缩包实例代码结果如下总结java解压zip压缩包坐在旁边的小伙伴问我怎么用 java 将服务器上的压缩文件解压出来,

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分