Josephus环的四种解法(约瑟夫环)基于java详解
作者:---dgw博客 时间:2022-02-28 23:29:13
约瑟夫环
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解
引用别人的一个图:直观说明问题
分析:
第一步:从1开始报数为3的时候就删除3号结点
第二步:从4号结点开始报数,当为3的时候删除6号结点;
第三步:从7号结点开始报数,当为3的时候删除1号结点;
第四步:从2号结点开始报数,当为3的时候删除5号结点;
第五步:从7号结点开始报数,当为3的时候删除2号结点;
第六步:从4号元素开始报数,当为3的时候删除8号结点;
第七步:又从4号开始报数,当为3的时候删除4号结点,此时链表中只有一个7号结点,所以最后的结点就是7号结点;
1.模拟解法
public class 模拟 {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
//总人数
int n=in.nextInt();
// 数到m的那个人出列
int m=in.nextInt();
// 初始化为0 都没有出去
int [] arr=new int[n];
//剩下的人数
int peopleLeft=n;
//初始化下标
int index=0;
// 下标计算器
int count=0;
// >0 出循环为负
while (peopleLeft>1){
if(arr[index]==0){
// count为计步器 不是下标指向
count++;
if(count==m){
arr[index]=1;
count=0;
peopleLeft--;
}
}
index++;
if(index==arr.length){
index=0;
}
}
for (int i = 0; i < arr.length; i++) {
if(arr[i]==0){
System.out.println(i+1);
}
}
}
}
2.递归解法
/**
* 递归式:
* f(1)=0; 第一个位置永远为0
* f(i)=f(i)+m%n;
*/
public static int yuesefu(int n,int m){
if(n==1){
return 0;
}else {
return (yuesefu(n-1,m) + m) % n;
}
}
public static void main(String[] args) {
System.out.println(yuesefu(41,3)+1);
vailCode(41,3);
}
//逆推验证代码
public static void vailCode(int a,int b){
System.out.print(b);
int reslut;
for (int i = a; i >=2 ; i--) {
reslut=2;
for (int j = i; j <=a ; j++) {
reslut=(reslut+b)%j;
}
System.out.printf("->%d",reslut+1);
}
}
3.循环链表解法
public class CircularLinkedList {
public static void main(String[] args) {
/**
* 节点类
*/
class Node{
private int data=1;
private Node next;
Node(){
next=null;
}
}
Node head,temp;
head=new Node();
head.data=1;
int a=41;
int b=3;
// 临时节点
temp=head;
for (int i = 0; i < a; i++) {
Node new_node=new Node();
new_node.data=i+1;
temp.next=new_node;
temp=new_node;
}
temp.next=head.next;
while (head.next!=head){
for (int i = 0; i < b-1; i++) {
head=head.next;
}
System.out.print("->"+(head.data+1));
head.next=head.next.next;
}
System.out.println(head.data);
}
}
4.Collection解法
public static void main(String[] args) {
int a=41;
int b=3;
LinkedList<Integer> list = new LinkedList<>();
for (int i = 0; i < a; i++) {
list.add(i+1);
}
while (list.size()>1){
for (int i = 0; i < b-1; i++) {
list.add(list.remove());
}
System.out.print("->"+list.getFirst());
list.remove();//remve head
}
System.out.println(list.getFirst());
}
来源:https://www.cnblogs.com/dgwblog/p/10086189.html
标签:josephus,环,解法,约瑟夫环,java
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
打印Java程序的线程栈信息方式
2021-11-02 19:00:28
Java输入年份和月份判断多少天实例代码
2023-12-23 10:43:11
浅谈Java面向接口编程
2021-07-25 16:29:58
MyBatis中XML 映射文件中常见的标签说明
2023-01-07 08:02:59
MyBatis利用MyCat实现多租户的简单思路分享
2022-08-16 18:58:33
![](https://img.aspxhome.com/file/2023/6/62716_0s.png)
Spring的refresh()方法相关异常解析
2021-12-08 07:39:07
Java String不可变性实现原理解析
2023-11-09 23:15:53
Java实现走迷宫回溯算法
2022-06-02 05:11:29
![](https://img.aspxhome.com/file/2023/6/62976_0s.jpg)
java开发RocketMQ生产者高可用示例详解
2023-04-27 13:27:57
Spring Boot如何优化内嵌的Tomcat示例详解
2023-11-13 17:52:53
springboot项目打成war包部署到tomcat遇到的一些问题
2023-10-12 12:46:46
Java二叉搜索树基础原理与实现方法详解
2022-09-12 17:20:59
![](https://img.aspxhome.com/file/2023/4/65154_0s.png)
Java GZIP压缩与解压缩代码实例
2023-11-20 15:57:17
Spring Security OAuth2认证授权示例详解
2022-09-11 19:45:47
![](https://img.aspxhome.com/file/2023/1/72281_0s.png)
shiro实现单点登录(一个用户同一时刻只能在一个地方登录)
2022-07-04 01:37:55
![](https://img.aspxhome.com/file/2023/3/68193_0s.png)
Java日常练习题,每天进步一点点(33)
2023-09-22 05:32:41
Java实现浪漫流星表白的示例代码
2023-04-02 14:50:35
![](https://img.aspxhome.com/file/2023/5/68715_0s.gif)
C# 操作XML文档 使用XmlDocument类方法
2023-06-11 04:21:14
SpringBoot整合canal实现数据同步的示例代码
2022-05-07 19:51:24
![](https://img.aspxhome.com/file/2023/1/61661_0s.png)
Java经典面试题汇总:Mybatis
2021-09-20 07:42:44