问题描述:

编号为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. less 4-7

    LESS--4 先试一下单引号,发现没有效果,不报错,然后根据题目用双引号,报错. 根据报错的内容可以发现,参数ID是包括在一对双引号和括号之中的.和上一题类似,构造注入查询语句. ") a ...

  2. Unity 使整个UnityUI变成彩色的BUG

    最近接手了一个两年前的老项目,在这个项目里碰到一个BUG ,每次运行到这个场景的时候,整个Unity 的所有UI包括Unity界面都会变成彩色. 后来发现是因为物体丢失,代码修改Image里的图片颜色 ...

  3. 关闭Mac的Microsoft AutoUpdate弹框提示

    macOS安装Microsoft Office for Mac之后,有时候会弹出Microsoft Auto Update微软应用自动更新工具.就像下面这样:(我不知道您会不会烦,我是烦了)如果您也和 ...

  4. url 编码解码

    from urllib import parse#url编码url = 'http://www.baidu.com?query = python基础教程'url_str = parse.quote_p ...

  5. Docker 安装 PHP+Nginx

    安装Nginx docker pull nginx 安装PHP docker pull php:7.3.5-fpm 启动PHP-FPM docker run --name myphpfpm -v /d ...

  6. Selenium私房菜系列9 -- Selenium RC服务器命令行参数列表【VV】

    使用示例: java -jar selenium-server.jar [-interactive] [options] -port <nnnn>: selenium服务器使用的端口号(默 ...

  7. Metasploit渗透测试框架二

    Metasploit基本使用方法 Metasploit基本命令 Metasploit程序需要使用Postgresql数据库. Postgresql是一种特性齐全的自由软件的对象-关系型数据库管理系统( ...

  8. python 中的lamda 表达式

      #1. print(list(filter(lambda x: x%2,range(10))))    #[1, 3, 5, 7, 9]# 非lamda表示def odd(x): return x ...

  9. java中带回调函数的字符串替换,类似js中的replace(rgExp,function)

    https://blog.csdn.net/weixin_33834075/article/details/91599852 import java.util.regex.Matcher; impor ...

  10. Java Swing 禁止黏贴动作

    碰到一个需求,不让复制黏贴. 可考的方法有:1 重写JTextField paste 函数    2 删除组件ActionMap中与CTRL + V按键相关的操作 因为JTextField 已经被封装 ...