Java 杭電ACM Train Problem I 1022

YX_blog發表於2015-08-16
Problem Description
As the new term comes, the Ignatius Train Station is very busy nowadays. A lot of student want to get back to school by train(because the trains in the Ignatius Train Station is the fastest all over the world ^v^). But here comes a problem, there is only one railway where all the trains stop. So all the trains come in from one side and get out from the other side. For this problem, if train A gets into the railway first, and then train B gets into the railway before train A leaves, train A can't leave until train B leaves. The pictures below figure out the problem. Now the problem for you is, there are at most 9 trains in the station, all the trains has an ID(numbered from 1 to n), the trains get into the railway in an order O1, your task is to determine whether the trains can get out in an order O2.
 

Input
The input contains several test cases. Each test case consists of an integer, the number of trains, and two strings, the order of the trains come in:O1, and the order of the trains leave:O2. The input is terminated by the end of file. More details in the Sample Input.
 

Output
The output contains a string "No." if you can't exchange O2 to O1, or you should output a line contains "Yes.", and then output your way in exchanging the order(you should output "in" for a train getting into the railway, and "out" for a train getting out of the railway). Print a line contains "FINISH" after each test case. More details in the Sample Output.
 

Sample Input
3 123 321 3 123 312
 

Sample Output
Yes. in in in out out out FINISH No. FINISH
Hint
Hint
For the first Sample Input, we let train 1 get in, then train 2 and train 3. So now train 3 is at the top of the railway, so train 3 can leave first, then train 2 and train 1. In the second Sample input, we should let train 3 leave first, so we have to let train 1 get in, then train 2 and train 3. Now we can let train 3 leave. But after that we can't let train 1 leave before train 2, because train 2 is at the top of the railway at the moment. So we output "No.".
解題思路:本題解決很簡單,就是火車必須先進後出(棧)不一定需要全部出棧後才能進,只要有出去的就能進來,實際上模擬棧的操作,這裡我用的是集合,用LinkedList最好,裡面涉及需要得到棧中最後一個以及移除最後一個,(本人之前一直用的Arraylist,坑了有點時間),
用加一個,裝一個字串”in“,和出一個”out“,要是條件滿足,就輸出這些,否則就不輸出。
package cn.hncu.acm;

import java.util.LinkedList;
import java.util.Scanner;

public class p1022 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			int n=sc.nextInt();//接收:題目要求
			String a=sc.next();
			char in[]=a.toCharArray();//收到的字串變成字元陣列
			String b=sc.next();
			char out[]=b.toCharArray();//字元陣列
			LinkedList<Character> list =new LinkedList<Character>();//針對這題,採用LinkedList是最實用的,
			int count=0;
			int j=0;
			String path[]=new String[2*n];//記錄輸出“in”和"out"

			//核心的處理
			for(int i=0;i<in.length;i++){
				list.add(in[i]);//每次加入一個都要進行判斷下
				path[count++]="in";//把in加入陣列path中
				while(!list.isEmpty()&&j<n&&list.getLast()==out[j]){//判斷,出棧的是否和壓棧(首先第一個)的一樣,若一樣,則表示有出去的
						path[count++]="out";//標記為“out”
						list.removeLast();//移除最後進來的一個物件(採用LinkedList的優勢就在這裡,之前採用Arraylist這個問題很難解決,果斷採用這個LinkedList)
						
						j++;//每次比較之後就開始進行下一個比較。
				}
			}
			
			//輸出
			if(list.isEmpty()){//若是空棧,說明出去完成,輸出es
				System.out.println("Yes.");
				for(int i=0;i<path.length;i++){
					System.out.println(path[i]);//輸出路徑
				}
			}else{
				System.out.println("No.");//否則輸出no
			}
			System.out.println("FINISH");//最後輸出完成
		}

	}

}

相關文章