JAVA實現電路佈線問題

7、實驗六電路佈線問題

實驗內容

內容:在一塊電路板的上、下兩端分別有n個接線柱。根據電路設計,要求用導線(i,a(i))將上端接線柱與下端接線柱相連,其中a(i)表示上端點i對應的下端點的值,如圖所示。
在這裏插入圖片描述
題目要求是在給定的連線中,選取不相交連線的最大子集,即不相交連線的最大數目。並把最大不相交子集的情況給列舉處理

解題思路

在製作電路板時,要求將這n條連線分佈到若干絕緣層上。在同一層上的連線不相交。電路佈線問題要確定將哪些連線安排在第一層上,使得該層上有儘可能多的連線。換句話說,該問題要求確定導線集Nets = {i,π(i),1 ≤ i ≤ n}的最大不相交子集。
在這裏插入圖片描述

源代碼

package f電路佈線問題;

import java.util.Scanner;

public class CircuitWiring {

	public static void main(String[] args) {

		Scanner scanner = new Scanner(System.in);
		System.out.println("輸入一共有幾個接線柱:");
		int i = scanner.nextInt();
		// 定義數組jxz
		int[] jxz = new int[i + 1];
		System.out.println("依次輸入這" + i + "個接線柱的下端接線柱號:");
		String all = scanner.next();
		// 對字符串進行操作
		String[] str = all.split(",");
		// 給數組c賦值
		jxz[0] = 0;// 給數組c的第一個賦值爲0
		int q = 0;// 定義str數組的循環開始
		for (int a = 1; a < i; a++) {
			jxz[a] = Integer.parseInt(str[q]);
			q++;
		}
		jxz[i] = Integer.parseInt(str[i - 1]);// 給數組c的最後一位賦值
		// 顯示數組c
//		for(int b=0;b<c.length;b++) {
//			System.out.print(c[b]+" ");
//		}

		CircuitWiring cW = new CircuitWiring(jxz);
		cW.getER(cW.jxz, cW.ER);
		int x = cW.shortPath(cW.jxz, cW.ER, cW.route);
		System.out.println("最大不相交連的線數目爲:" + x);
	}

	public int[] jxz;// 接線柱數組
	public int[][] ER;// 最大不相交子集
	public int[] route;// 最短路徑

	/**
	 * 	構造方法,進行初始化
	 * 
	 * @param jxz 接線柱數組
	 */
	public CircuitWiring(int[] jxz) {
		this.jxz = jxz;
		this.ER = new int[jxz.length][jxz.length];// 下標從1開始
		this.route = new int[jxz.length];
	}

	/**
	 * @see 輸出最大不相交子集的二維數組
	 * @param jxz 接線柱數組
	 * @param ER  輸入原始的二維數組
	 */
	public void getER(int[] jxz, int[][] ER) {
		int n = jxz.length - 1;
		for (int j = 0; j < jxz[1]; j++) {// i=1時,分了兩種情況,分別等於0,1
			ER[1][j] = 0;
		}
		for (int j = jxz[1]; j <= n; j++) {
			ER[1][j] = 1;
		}
		for (int i = 2; i <= n; i++) {// i大於1時,同樣分了兩種情況(當i=n時單獨計算,即此方法最後一行)
			for (int j = 0; j < jxz[i]; j++) {// 第一種
				ER[i][j] = ER[i - 1][j];
			}
			for (int j = jxz[i]; j <= n; j++) {// 第二種
				ER[i][j] = Math.max(ER[i - 1][j], ER[i - 1][jxz[i] - 1] + 1);
			}
		}
		ER[n][n] = Math.max(ER[n - 1][n], ER[n - 1][jxz[n] - 1] + 1);

		System.out.println();
		// 輸出電路佈線問題的矩陣
		for (int i = 1; i <= n; i++) {
			for (int j = 0; j <= n; j++) {
				System.out.print(ER[i][j] + " ");
			}
			System.out.println();
		}
		System.out.println();

	}

	/**
	 * @see 構造最優解
	 * @param jxz   接線柱數組
	 * @param ER    不相交連線的最大數目【二維數組】
	 * @param route 最短路徑
	 * @return 最大不相交連的線數目
	 */
	public int shortPath(int[] jxz, int[][] ER, int[] route) {
		int n = jxz.length - 1;
		int j = n;
		int m = 0;
		for (int i = n; i > 1; i--) {
			if (ER[i][j] != ER[i - 1][j]) {
				route[m++] = i;
				j = jxz[i] - 1;
			}

		}
		if (j >= jxz[1])
			route[m++] = 1;
		System.out.println("最大不相交連線爲:");
		int num = 0;
		for (int t = m - 1; t >= 0; t--) {
			System.out.print("【" + route[t] + "," + jxz[route[t]] + "】");
			num++;
			if (num <= m - 1) {
				System.out.print(",");
			}

		}
		System.out.println();
		return m;
	}

}

運行截圖

在這裏插入圖片描述

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