Task Sequences

其實發這邊文章的主要目的就是想分享一下Scanner函數,

與其一個一個從鍵盤接受int值,例如 int a = scanner.nextInt();還不如直接用String  獲取一行,然後在給數組賦值

類似於這樣String s = in.nextLine();

int aa = 0;
for(int j=1;j<=n;j++)
{
map[i][j]=((s.charAt(aa)-48)==1);
aa+=2;
}

這樣會節省時間   具體爲什麼樓主也不知道。。。

當然需要輸入的數字必須是個位數  原因你們懂得

下面上代碼

package com.graph;

import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;

public class Hamilton {

	
	//競賽圖  :每對頂點之間都有一條邊相連的有向圖稱爲競賽圖。
	void run() throws IOException{
		
		
		
		Scanner in = new Scanner(System.in);
		
		while(in.hasNext()){
			int n=in.nextInt();
			
			boolean map[][] = new boolean[n+5][n+5];
			int nxt[]=new int[n+5];//用來表示當前節點i的下一個節點就是nxt【i】;
			int ans[]=new int[n+5];
			String a = in.nextLine();
			for(int i=1;i<=n;i++)
			{
				String s = in.nextLine();
				int aa = 0;
				for(int j=1;j<=n;j++)
				{
					map[i][j]=((s.charAt(aa)-48)==1);//輸入數據  boolean類型;
					aa+=2;
				}
			}

			Arrays.fill(nxt, -1);
			
			int h=1;                 //h代表第一個節點。
			for(int i=2;i<=n;i++)
				if(map[i][h]){
					nxt[i]=h;      //如果此時遍歷的節點能到第一個節點  則把它掛在前面當做第一個節點。
					h=i;
				}
				else{              //如果不能到達第一個節點 則在後面尋找出它能到達的節點  ,插入進去
					int pre=h,pos=nxt[h];
					while(pos!=-1&&!map[i][pos]){
						pre=pos;
						pos=nxt[pos];
					}
					nxt[pre]=i;
					nxt[i]=pos;
				}
			int cnt=0;
			for(int i=h;i!=-1;i=nxt[i])
				ans[++cnt]=i;                  //得出輸出隊列
			System.out.println("1\n"+n);
			for(int i=1;i<n;i++)
				System.out.print(ans[i]+" ");
			System.out.println(ans[n]);
		}
	}
	
	
	public static void main(String[] args) throws Exception
	{
		new Hamilton().run();
	}
	
	
	

}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章