要求是:有n个点,证明是否有n-1个组合符合我们的要求。为了简化我就记做有8个点(1,2,3,4,5,6,7,8),一一对应相连,形成(1,2)(3,4)(5,6)(7,8)或(1,5)(2,6)(3,8)(4,7)等等,这里(1,2)和(2,1)是相同的。然后相互比较,把(1,2)(3,4)(5,6)(7,8)作为基准。比较的办法是这样的,比如:a:(1,2)(3,4)(5,6)(7,8) b:(1,5)(2,6)(3,8)(4,7).从a组开始,a组的1是和2相连的,得到2,然后根据2找到在b组中相连得数是6,再回到a组中找到和6相连得数是5,在b组中和5相连的是1,回到了起点数,可是还有其他3,4啥的还没有访问到,就说明b数组不符合要求。符合要求的是最后把所有的数都访问一遍,不能有重复的,最后回到起始的点。要找到n-1个这样的数据。大家能给个啥好的建议思路吗?效率问题是个大麻烦。
我这里还有个先期写的穷举法写的列出所有这样组合的代码,是用eclipse的,可是当n大于6的时候,他只有列出10组组合,不知道问题出在那里,我上传一下,请大家帮我看看啊,先谢谢了
import java.util.ArrayList;
import java.util.Random;
public class Aleatoire {
private int num;
private int numOfList;
private ArrayList<String> listOfBinary = new ArrayList<String>();
private Random gen = new Random();
//
public Aleatoire(int number){
this.num = number;
int numberOfBinary = fac(num)/(fac(num-2)*2);
this.numOfList = numberOfBinary/(num/2)*2;
System.out.println(numOfList);
ArrayList[] lists = new ArrayList[numOfList];
for (int i=0;i<numOfList;i++){
lists[i] = new ArrayList();
lists[i] = takeList(listOfBinary);
System.out.println(lists[i]);
}
}
//
private int fac(int number){
if (number == 0 || number == 1) return 1;
else return number*fac(number-1);
}
//
private ArrayList takeList(ArrayList<String> listOfBinary){
ArrayList test = new ArrayList();
ArrayList<Integer> temporary = new ArrayList<Integer>();
for (int i=0;i<(num/2);i++){
int a = gen.nextInt(num);
while (temporary.contains(new Integer(a)))
a = gen.nextInt(num);
temporary.add(new Integer(a));
int b = gen.nextInt(num);
while (temporary.contains(new Integer(b)))
b = gen.nextInt(num);
temporary.add(new Integer(b));
String banary = "("+(a+1)+","+(b+1)+")";
while (listOfBinary.contains(banary)){
temporary.remove(new Integer(a));
temporary.remove(new Integer(b));
a = gen.nextInt(num);
while (temporary.contains(a))
a = gen.nextInt(num);
temporary.add(a);
b = gen.nextInt(num);
while (temporary.contains(b))
b = gen.nextInt(num);
temporary.add(b);
banary = "("+(a+1)+","+(b+1)+")";
}
test.add(banary);
listOfBinary.add(banary);
}
return test;
} public static void main(String[] args) {
Aleatoire a = new Aleatoire(4);
}
}
我这里还有个先期写的穷举法写的列出所有这样组合的代码,是用eclipse的,可是当n大于6的时候,他只有列出10组组合,不知道问题出在那里,我上传一下,请大家帮我看看啊,先谢谢了
import java.util.ArrayList;
import java.util.Random;
public class Aleatoire {
private int num;
private int numOfList;
private ArrayList<String> listOfBinary = new ArrayList<String>();
private Random gen = new Random();
//
public Aleatoire(int number){
this.num = number;
int numberOfBinary = fac(num)/(fac(num-2)*2);
this.numOfList = numberOfBinary/(num/2)*2;
System.out.println(numOfList);
ArrayList[] lists = new ArrayList[numOfList];
for (int i=0;i<numOfList;i++){
lists[i] = new ArrayList();
lists[i] = takeList(listOfBinary);
System.out.println(lists[i]);
}
}
//
private int fac(int number){
if (number == 0 || number == 1) return 1;
else return number*fac(number-1);
}
//
private ArrayList takeList(ArrayList<String> listOfBinary){
ArrayList test = new ArrayList();
ArrayList<Integer> temporary = new ArrayList<Integer>();
for (int i=0;i<(num/2);i++){
int a = gen.nextInt(num);
while (temporary.contains(new Integer(a)))
a = gen.nextInt(num);
temporary.add(new Integer(a));
int b = gen.nextInt(num);
while (temporary.contains(new Integer(b)))
b = gen.nextInt(num);
temporary.add(new Integer(b));
String banary = "("+(a+1)+","+(b+1)+")";
while (listOfBinary.contains(banary)){
temporary.remove(new Integer(a));
temporary.remove(new Integer(b));
a = gen.nextInt(num);
while (temporary.contains(a))
a = gen.nextInt(num);
temporary.add(a);
b = gen.nextInt(num);
while (temporary.contains(b))
b = gen.nextInt(num);
temporary.add(b);
banary = "("+(a+1)+","+(b+1)+")";
}
test.add(banary);
listOfBinary.add(banary);
}
return test;
} public static void main(String[] args) {
Aleatoire a = new Aleatoire(4);
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货