其實發這邊文章的主要目的就是想分享一下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();
}
}