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;
	}

}

运行截图

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值