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);
}
}
广义容斥原理
最新推荐文章于 2021-06-12 17:12:03 发布