为了转生而点技能-Java难题纪录 (作业:染病接触之人员追踪链

前言:

本篇是参加学校开设的java资讯班的作业,由於对於笔者来说花蛮多时间的,所以想记录下来解题的过程,以供後续参考。

题目:请随机产生一群可疑接触的人群,并编号(ID),同时请他们纪录接触别人的号码是多少,假设他们接触的人都只有一人并且不会重覆;之後随机选择一个人为染疫者,并请找出相关传播链的人。如下图:
https://ithelp.ithome.com.tw/upload/images/20211204/20143762wGhqX36ORR.png


难题一:如何乱数取值不重覆。
刚开始尚未学习method,虽然网路上有一篇文章有写到[Java]产生不重复之乱数,但是在method回传应用上,还是一知半解。
後来回头看上课讲义,发现利用shuffle algorithm的swap即可。

		System.out.println("Enter number of citizens");
		Scanner citizens = new Scanner(System.in);
		int c = citizens.nextInt();                    //指定团体人数有几人
		int[] C = new int[c];
		System.out.printf("%9s", "ID");
		for (int i = 0; i < C.length; i++) {
			System.out.printf("%3d", i);
		}
		;
		System.out.println();

		int[] Contactee; 
		Contactee = new int[c];
		for (int i = 0; i < Contactee.length; i++) {
			Contactee[i] = i;
		}
		;
        
        //以下乱数取值不重覆
		for (int i = 0; i < Contactee.length - 1; i++) {
			int m = (int) (Math.random() * (Contactee.length - i) + i);   
			int temp = Contactee[i];
			Contactee[i] = Contactee[m];
			Contactee[m] = temp;
		}

难题之二:如何串联ID与接触者的关系。
虽然在纸上拆解流程都没问题,但是因为对於本题在while及for回圈之间的关系,及语法不熟练,想通前要死不活,想通後不禁佩服自己的蠢。

import java.util.Scanner;

public class ContagionControl {

	public static void main(String[] args) {
		
		// part2开始
		System.out.println();
		System.out.println("Enter id of infected citizen :");       //指定一个ID为传染源头。
		Scanner id = new Scanner(System.in);
		int idnumber = id.nextInt();
		int enternumber = idnumber;           //纪录传染链的头,方便後面对比使否为传染链的尾。
 		System.out.println("These citizens are to br self-isolated in the following 14 days:");
 		System.out.printf("%d",idnumber);
        
        //ID与接触者关系
 		while (Contactee[idnumber] != enternumber) {
			for (int i = 0; i < C.length; i++) {
				if (Contactee[idnumber] == i) {
					System.out.printf("%3d", i);
					idnumber = i;
				}
				;
			}
			;
			if(Contactee[idnumber] == enternumber) {       //当尾巴连到传染链的头,等於结束传染链。
				break;
			};
		}
		;
        id.close();
        citizens.close();
        
	};

}

全部的code

import java.util.Scanner;

public class ContagionControl {

	public static void main(String[] args) {
		System.out.println("Enter number of citizens");
		Scanner citizens = new Scanner(System.in);
		int c = citizens.nextInt();
		int[] C = new int[c];
		System.out.printf("%9s", "ID");
		for (int i = 0; i < C.length; i++) {
			System.out.printf("%3d", i);
		}
		;
		System.out.println();

		int[] Contactee; 
		Contactee = new int[c];
		for (int i = 0; i < Contactee.length; i++) {
			Contactee[i] = i;
		}
		;
		for (int i = 0; i < Contactee.length - 1; i++) {
			int m = (int) (Math.random() * (Contactee.length - i) + i);
			int temp = Contactee[i];
			Contactee[i] = Contactee[m];
			Contactee[m] = temp;
		}
		;
		System.out.printf("%5s", "Contactee");
		for (int i = 0; i < C.length; i++) {
			System.out.printf("%3d", Contactee[i]);
		}
		;
		System.out.println();
		System.out.println("-----------------------");
		
		// part2
		System.out.println();
		System.out.println("Enter id of infected citizen :");       //指定一个ID为传染源头。
		Scanner id = new Scanner(System.in);
		int idnumber = id.nextInt();
		int enternumber = idnumber;           //纪录传染链的头,方便後面对比使否为传染链的尾。
 		System.out.println("These citizens are to br self-isolated in the following 14 days:");
 		System.out.printf("%d",idnumber);
        
        //ID与接触者关系
 		while (Contactee[idnumber] != enternumber) {
			for (int i = 0; i < C.length; i++) {
				if (Contactee[idnumber] == i) {
					System.out.printf("%3d", i);
					idnumber = i;
				}
				;
			}
			;
			if(Contactee[idnumber] == enternumber) {       //当尾巴连到传染链的头,等於结束传染链。
				break;
			};
		}
		;
        id.close();
        citizens.close();
        
	};

}

参考文章:

  1. [Java]产生不重复之乱数:https://tw4x.wordpress.com/2016/11/07/java-random/
  2. Java 程序架构与输入/输出:http://www.tsnien.idv.tw/Java1_WebBook/chap2/2-5%20%E6%A0%BC%E5%BC%8F%E5%8C%96%E8%BC%B8%E5%87%BA.html

<<:  ThinkPHP V5.1 新增控制器

>>:  第二只狗勾-秋田

#6. Scroll Animation(原生JS版), #7. Progress Steps(原生JS版)

Scroll Animation 卡片滑动载入效果(原生JS版) CodePen: https://...

用一半的时间做两倍的事

听说,这个书名引发了一些争议。老板角色的人看这本书都认为RD团队读完後就是吃了大补丸,以後做专案只需...

[Java Day17] 4.5. 多载

教材网址 https://coding104.blogspot.com/2021/06/java-o...

C#入门之异步编程

在很多情况下,我们的任务前后之间没有必然的联系的,所以我们可以不需要等待前面命令结束,才开始后面的任...

【D16】熟悉新厨具:Scanner

前言 串连行情的部分OK了,我们再回到盘後资讯,这是要使用的是Scanners。 参考网站:Stoc...