广义容斥原理

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值