问题描述:

编号为1,2,......,n的n个人(每个人的信息有编号、姓名和密码三项)按照顺时针方向围坐一圈,

每个人有且只有一个密码(正整数,密码用随机方式赋值,范围1-15)。一开始任选一个正整数作为报数

上限值,从第一个人开始顺时针方向自1开始报数,报到m时停止报数。报m 的人出列,将他的密码作为新

的m 值,从他在顺时针方向的下一个人开始重新报数,如此下去,直到所有人全部出队为止。设计一个程

序来求出队顺序。

分析:

为解决约瑟夫问题而设计的单向循环链表,应实现如下功能 :
1  添加元素
2  拥有指示当前选中元素的游标
3  游标可循环访问链表中各元素
4  可将游标向前移动指定步数
5  可删除当前游标所指定的元素
*输入:每个人的信息;起始m值
*输出:出队的人信息。

步骤:

1 确定数据类型
2 建立链表
3 实现循环方法
4 输出结果

 1 import  java.util.*;
2 import java.io.*;
3
4 public class JosephProb {
5 static int N;
6
7 public static void main(String[] args) throws IOException{
8 CircleLinkList list=new CircleLinkList();
9 Scanner sc=new Scanner(System.in);
10 System.out.print("请输入参加的总人数N :");
11 N=sc.nextInt();
12
13 int i,data[][]=new int [N][2];
14 String name[]=new String[N];
15 System.out.println("请输入每个人的编号和姓名:");
16 for( i=0;i<N;i++){
17 data[i][0]=sc.nextInt();
18 name[i]=sc.nextLine();
19 }
20 System.out.print("请输入初始密码值(正整数):");
21 int m=sc.nextInt();
22
23 //生成密码
24 List<Integer> l = new ArrayList<Integer>();
25 while(l.size()<N){
26 int j = (int)(Math.random()*15+1);
27 l.add(j);
28 }
29 //初始化
30 for(i=0;i<N;i++){
31 data[i][1]=l.get(i);
32 list.Init(data[i][0],name[i],data[i][1]);
33 }
34 //出列
35 list.Operation(m);
36 System.out.println("Over!");
37 }
38 }
39 class Person{
40 int number;
41 int password;
42 String names;
43 Person next;
44 public Person (int number,String names,int password){
45 this.number=number;
46 this.names=names;
47 this.password=password;
48 this.next=null;
49 }
50 }
51 class CircleLinkList {
52 Person head;//头结点
53 Person current;
54
55 public boolean isEmpty(){ return head==null; }
56
57 public void Init(int number,String names,int password) {
58 Person tmp=new Person(number,names,password);
59 if(this.isEmpty()){
60 head=tmp;
61 current=head;
62 }
63 else{
64 current.next=tmp;
65 current=tmp;
66 }
67 //最后一个节点的next指向第一个
68 current.next = head;
69 }
70
71 public void Operation(int m){
72 System.out.println("出列人信息:[编号 姓名 密码]");
73 while(current!=current.next){
74 for(int i=1;i<m;i++){ //从1开始报数,到m时停止报数
75 current=current.next;//指针移动到出列的前一个节点
76 }
77 m=current.next.password;//修改密码为出列人的密码
78 //输出-出队人的信息
79 System.out.print("["+current.next.number+" "+current.next.names+" "+current.next.password+"]\n");
80 current.next=current.next.next;//删除
81 }
82 System.out.println();
83 System.out.println("最后剩余的是 ["+current.number+" "+current.names+" "+current.password+" ]");
84 }
85 }

补充:

可以将出队的人用队列进行存储,并输出。

实现就是新建一个QueueList,添加Insert()输出Dequeue()即可。

代码略。

Joseph Problem With Passwords In Java的更多相关文章

  1. LeetCode 218. The Skyline Problem 天际线问题(C++/Java)

    题目: A city's skyline is the outer contour of the silhouette formed by all the buildings in that city ...

  2. 【LeetCode/LintCode 题解】约瑟夫问题 · Joseph Problem

    n个人按顺序围成一圈(编号为1~n),从第1个人从1开始报数,报到k的人出列,相邻的下个人重新从1开始报数,报到k的人出列,重复这个过程,直到队伍中只有1个人为止,这就是约瑟夫问题.现在给定n和k,你 ...

  3. java标准-密码用数组比用字符串安全

    转载:http://my.oschina.net/jasonultimate/blog/166968 1) Since Strings are immutable in Java if you sto ...

  4. 10 Things Every Java Programmer Should Know about String

    String in Java is very special class and most frequently used class as well. There are lot many thin ...

  5. Core Java Volume I — 3.3. Data Types

    3.3. Data TypesJava is a strongly typed language(强类型语音). This means that every variable must have a ...

  6. 如何解决 Java 安全问题?

    如何解决 Java 安全问题,目前的应对策略都十分笨拙,往往适得其反.幸运的是,有一种新的方法可以将安全机制嵌入 Java 执行平台--或者更具体地说,嵌入 Java 虚拟机中,进而规避一些「Big ...

  7. How to check for and disable Java in OS X

    Java used to be deeply embedded in OS X, but in recent versions of the OS it's an optional install. ...

  8. ACM java写法入门

    打2017icpc沈阳站的时候遇到了大数的运算,发现java与c++比起来真的很赖皮,竟然还有大数运算的函数,为了以后打比赛更快的写出大数的算法并且保证不错,特意在此写一篇博客, 记录java的大数运 ...

  9. Passwords Gym - 101174E (AC自动机上DP)

    Problem E: Passwords \[ Time Limit: 1 s \quad Memory Limit: 256 MiB \] 题意 给出两个正整数\(A,B\),再给出\(n\)个字符 ...

  10. 干货 | 10分钟带你彻底了解column generation(列生成)算法的原理附java代码

    OUTLINE 前言 预备知识预警 什么是column generation 相关概念科普 Cutting Stock Problem CG求解Cutting Stock Problem 列生成代码 ...

随机推荐

  1. oracle通过计划任务备份表

    1.先手动创建表 create table user01_backup_20210204 select * from user01 commit; 2.清空表 truncate table user0 ...

  2. ChatGPT回答的关于maxscript + python

  3. Centos 7.9 部署Kubernetes集群 (基于containerd 运行时)

    前言 当Kubernetes社区宣布1.20版本之后会逐步弃用 dockershim ,当时也有很多自媒体在宣 传Kubernetes弃用Docker.其实,我觉得这是一种误导,也许仅仅是为了蹭热度. ...

  4. storcli64简述

    一.查询raid卡.raid组.物理硬盘信息 Controller_id:硬盘所在的raid卡的id,可以将该参数设置为all,表示查询该工具可管理的所有控制器的id Enclosure_id:硬盘所 ...

  5. 创建maven项目时,IntelliJ IDEA2019出现:Unable to import maven project: See logs for details 报错

    开发环境:IntelliJ IDEA 2019.1.3 + Maven3.6.3 报错截图 主要原因 IntelliJ IDEA 2019.1.3 与 Maven3.6.3 不兼容问题 解决方案 将m ...

  6. TypeScript 学习之路

    一.下载与安装 二.变量与数据类型 三.函数 四.类

  7. StunServer

    Stun 服务器 npm下载stun包 npm i stun -s google stun服务器 google的stun的服务器一般国内访问较慢,所以一般自己搭建一个服务器 const stun = ...

  8. Visio中的图无失真导入LaTeX中

    参考网址: LaTeX导入图片不失帧的方法_奋斗的西瓜瓜的博客-CSDN博客_latex图片模糊 LaTeX中插入eps格式图片_不觉岁华成暗度的博客-CSDN博客_eps latex Visio图片 ...

  9. vue 中的 .sync 修饰符 与 this.$emit('update:key', value)

    vue 中 .sync 修饰符,是 2.3.0+ 版本新增的功能 在有些情况下,我们可能需要对一个 prop 进行"双向绑定".不幸的是,真正的双向绑定会带来维护上的问题,因为子组 ...

  10. python日志篇-基础版

    对常用python日志语法做记录,方便以后重复使用 print内容记录到文件: #!/usr/bin/env python # -*- coding: utf-8 -*- ##____________ ...