广义容斥原理

import java.util.ArrayList;
import java.io.*;

//广义容斥原理,输入路径的起始位置,并输入排除的路径,输出从起点到终点的路径个数并输出至少5条路径。

class Test3{

	//从控制台读入数据
	private static int readDataFromConsole(String prompt) {
        	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        	String str = null;
        	try {
            		System.out.print(prompt);
            		str = br.readLine();

        	} catch (IOException e) {
            		e.printStackTrace();
        	}
		boolean flag = true;
		int retValue = 0;
		while(flag){
			try{
				retValue = Integer.parseInt(str);
				flag = false;
			}catch(Exception e){
				System.out.println("请输入整数.");
			}
		}
        	return retValue;
    	}

	static double zuhe(double n,double m)
	{
		double s=1;
		double x = n - m;
		for(;n>0;n--){
			s = s * n;
		}
		for(;m > 0;m --){
			s=s/m;
		}
		for(;x > 0;x--){
			s = s / x;
		}
		return s;
	}
	
	public static void main(String args[]){
		class Node{
			double x = 0;
			double y = 0;
		}
		class NodeNode{
			Node start = new Node();
			Node end = new Node();
		}
		Node start = new Node();
		Node end = new Node();
		
		ArrayList<NodeNode> nodeNodes = new ArrayList<NodeNode>(100);
		NodeNode nodeNode = null;
		for(int i = 0;i<100;i++){
			nodeNode = new NodeNode();
			nodeNodes.add(nodeNode);
			nodeNode = null;
		}
		
		double n = 0,cent = 0;
		double s = 0;
		
		start.x = readDataFromConsole("请输入起点的 X 坐标: ");
		start.y = readDataFromConsole("请输入起点的 Y 坐标: ");
		end.x = readDataFromConsole("请输入终点的 X 坐标: ");
		end.y = readDataFromConsole("请输入终点的 Y 坐标: ");

		n = readDataFromConsole("请输入排除的边的条数: ");

		for(int i = 1;i <= n;i ++){//排除的边依次为起点,终点
			nodeNodes.get(i).start.x = readDataFromConsole("请输入第" + i + "条排除边起点的 X 坐标: ");
			nodeNodes.get(i).start.y = readDataFromConsole("请输入第" + i + "条排除边起点的 Y 坐标: ");
			nodeNodes.get(i).end.x = readDataFromConsole("请输入第" + i + "条排除边终点的 X 坐标: ");
			nodeNodes.get(i).end.y = readDataFromConsole("请输入第" + i + "条排除边终点的 Y 坐标: ");
		}
		s = zuhe((end.x-start.x+end.y-start.y),(end.x-start.x));
		System.out.println("未排除不能走的路径的总路径数:" + s);
		double x=0,y=0;
		for(int i=0;i<n;i++)
		{
			x=nodeNodes.get(i).start.x-start.x;
			y=nodeNodes.get(i).start.y-start.y;
			cent=zuhe(x+y,x);
			x=end.x-nodeNodes.get(i).end.x;
			y=end.y-nodeNodes.get(i).end.y;
			cent=cent*zuhe(x+y,x);
			double ii = i + 1;
			System.out.println("不能走的A" + ii + "路径数为:" + cent);
			s = s - cent;
		}
		for(int i=0;i<n-1;i++){
			for(int j=i+1;j<n;j++){
				x=nodeNodes.get(i).start.x-start.x;
				y=nodeNodes.get(i).start.y-start.y;
				cent=zuhe(x+y,x);
				x=nodeNodes.get(j).start.x-nodeNodes.get(i).end.x;
				x=nodeNodes.get(j).start.y-nodeNodes.get(i).end.y;
				if(x==0||y==0){cent=cent;}
				else if(x<0||y<0){cent=0;}
				else{cent=cent*zuhe(x+y,x);}
				x=end.x-nodeNodes.get(j).end.x;
				y=end.y-nodeNodes.get(j).end.y;
				cent=cent*zuhe(x+y,x);
				double ii = i + 1;
				double jj = j + 1;
				System.out.println("不能走的A" + ii + "A" + jj + "路径数为:" + cent);
				s = s + cent;
			}
		}
		for(int i=0;i<n-2;i++)
		{
			for(int j=i+1;j<n-1;j++)
			{
				for(int k=j+1;k<n;k++)
				{
					x = nodeNodes.get(i).start.x-start.x;
					y=nodeNodes.get(i).start.y-start.y;
					cent=zuhe(x+y,x);
					x=nodeNodes.get(j).start.x-nodeNodes.get(i).end.x;
					x=nodeNodes.get(j).start.y-nodeNodes.get(i).end.y;
					if(x==0||y==0){cent=cent;}
					else if(x<0||y<0){cent=0;}
					else{cent=cent*zuhe(x+y,x);}
					x=nodeNodes.get(k).start.x-nodeNodes.get(j).end.x;
					x=nodeNodes.get(k).start.y-nodeNodes.get(j).end.y;
					if(x==0||y==0){cent=cent;}
					else if(x<0||y<0){cent=0;}
					else{cent=cent*zuhe(x+y,x);}
					x=end.x-nodeNodes.get(k).end.x;
					y=end.y-nodeNodes.get(k).end.y;
					cent=cent*zuhe(x+y,x);
					double ii = i + 1;
					double jj = j + 1;
					double kk = k + 1;
					System.out.println("不能走的A" + ii + "A" + jj + "A" + kk + "路径数为:" + cent);
					s = s - cent;
				}
			}
		}
		x=nodeNodes.get(0).start.x-start.x;
		y=nodeNodes.get(0).start.y-start.y;
		cent=zuhe(x+y,x);
		x=nodeNodes.get(1).start.x-nodeNodes.get(0).end.x;
		x=nodeNodes.get(1).start.y-nodeNodes.get(0).end.y;
		if(x==0||y==0){cent=cent;}
		else if(x<0||y<0){cent=0;}
		else{cent=cent*zuhe(x+y,x);}
		x=nodeNodes.get(2).start.x-nodeNodes.get(1).end.x;
		x=nodeNodes.get(2).start.y-nodeNodes.get(1).end.y;
		if(x==0||y==0){cent=cent;}
		else if(x<0||y<0){cent=0;}
		else{cent=cent*zuhe(x+y,x);}
		x=nodeNodes.get(3).start.x-nodeNodes.get(2).end.x;
		x=nodeNodes.get(3).start.y-nodeNodes.get(2).end.y;
		if(x==0||y==0){cent=cent;}
		else if(x<0||y<0){cent=0;}
		else{cent=cent*zuhe(x+y,x);}
		x=end.x-nodeNodes.get(3).end.x;
		y=end.y-nodeNodes.get(3).end.y;
		cent=cent*zuhe(x+y,x);
		System.out.println("不能走的A1A2A3A4路径数为:" + cent);
		s=s+cent;
		System.out.println("排除后的总路径数为:" + s);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值