问题描述
我们国家大力发展道路交通基础设施,最近这些年修建了大量的高铁线路,以促进国内的物资运输和调配,ZZ是一个超级货运站,是连接亚欧货运的枢纽站,现在ZZ货运站列车调度铁轨的结构如下图所示。
两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?ZZ站希望你帮他们设计一个算法,然后给出最终结果。
问题分析
我们以上述题目中的例子来分析一下问题
本题我们采用链表这一数据结构来解决,我们给定链表Track。
1.我们从第一辆列车开始,进入第一条轨道。后面的列车在选择轨道进入时,应该对创建的所有轨道遍历一遍,如果某个轨道最后一个列车的编号如果大于待进入轨道列车编号,那么待进入轨道的列车就可以进入该轨道。比如限下面这种情况,2号列车可以加入Track轨道。
如果遍历完所有非空链表后不能将该列车放入某个非空轨道,则重新进入新的轨道。如下:
2.当待进入的列车的编号为最大编号(9)时,为了使用更少的轨道,我们应该让9号列车在新的轨道上直接通行,这时候新开的轨道就是空轨道。
这时候剩下的列车最大编号就是9-1=8,我们遍历轨道中的第一个节点(由于是从大到小的链表链接,最大编号肯定在链表前面),若存在于轨道中,则开走此列车,一直重复直到最大编号列车没有在轨道中。
代码实现
1.Node和Track类创建就不用多说了,大家忘记了的话可以去看看Java的链表实现,网上很多,我这里的链表是带有头节点的。我在Track类中写了三个方法。其中add 方法是给链表添加节点,可以是空链表也可以不是空链表;del方法,则是删去非空链表的第一个节点(头节点紧挨着的那个节点);ifMin有一个整型参数传入,判断传入的参数是否比该链表中所有节点的value小。
2.主类中。
详细代码:
/*
* author lzp from ncepu
*
* */
import java.util.Scanner;
public class Subway {
public static void main(String[] args) {
boolean target;
Scanner scanner = new Scanner(System.in);
int count = 0; //使用轨道计数器
int empty = 0; //空轨道数量
System.out.println("请输入列车数量");
int n = scanner.nextInt(); //n是待排序的列车数量
int m = n;
Track[] tracks = new Track[n];
for (int i = 0; i < n; i++) {
tracks[i] = new Track();
}
System.out.println("请输入列车编号");
for (int i = 0; i < n; i++) {
int temp = scanner.nextInt();
if (temp == m ){
if (empty==0){
count++;
empty++;
m--;
}
else {
m--;
do {
target = false;
for (int j = 0; j < n; j++) {
if (tracks[j].head.next!=null && tracks[j].head.next.value == m){
tracks[j].del();
m--;
target = true;
if (tracks[j].head.next==null){
empty++;
}
}
}
}while (target);
}
}
else {
boolean target2 = true;
for (int j = 0; j < n; j++) {
if(tracks[j].ifMin(temp)&&target2==true) {
tracks[j].add(temp);
target2 = false;
}
}
if (target2){
if (empty==0){
count++;
tracks[i].add(temp);
}
else {
empty--;
tracks[i].add(temp);
}
}
}
}
System.out.println(count);
}
static class Track {
Node head = new Node();
Track(){
head.next=null;
}
void add(int value){
Node newNode = new Node();
newNode.value = value;
if (head == null) {
head.next = newNode;
return;
}
Node tmp = head;
while (tmp.next != null) {
tmp = tmp.next;
}
tmp.next = newNode;
}
void del (){
Node temp = head.next.next;
head.next.next = null;
head.next = temp;
}
boolean ifMin(int num){
Node newNode = new Node();
newNode.value = num;
if (head == null) {
head.next = newNode;
return false;
}
Node tmp = head;
while (tmp.next != null) {
tmp = tmp.next;
}
if (tmp.value > num)
return true;
return false;
}
}
static class Node{
int value;
Node next;
}
}