功能:有一个图,例如有3个点,从一个点出发,经过所有的点,又回到原点。(离散数学,无方向完全图)
例如输入3,生成A,B,C,进行函数处理后,最后生成:ACBA,BCAB,CBAC.
求各位大大多多指教,进行算法优化,我虚心接受批评,菜鸟敬上。
<!-- lang: java -->
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Map_ABC {
static ArrayList list=new ArrayList();
static char Str[] = null;
static int num;
public static int number(){//返回输入图节点数
int num = 0;
try{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String sb=in.readLine();
num = Integer.valueOf(sb).intValue();
}catch(Exception exc){
System.out.println("输入不合法。");
}
return num;
}
public static void loop(int n,String s){//循环算法
if(n==0){
list.add(s+s.substring(0,1));
return ;
}
for(int i=0;i<num;i++){
if(s.indexOf(String.valueOf(Str[i]))==-1){
loop(n-1,s+Str[i]);
}
}
}
public static void main(String args[]){
num=number();
Str=new char[num];
for(int i=0;i<num;i++){
Str[i]=(char)(i+65);
}
for(int i=0;i<num;i++){
loop(num-1,""+Str[i]);
}
System.out.println("完全图所有路径如下:");
for(int i = 0;i < list.size(); i ++){
System.out.println(list.get(i));
}
System.out.println("完全图不重复的路径如下:");
for(int i =list.size()-1;i >=0; i --){
String strReverse=new StringBuffer(""+list.get(i)).reverse().toString();
for(int j =i;j >=0; j --){
if(list.get(j).equals(strReverse)==true)
list.remove(j);
}
}
for(int i = 0;i < list.size(); i ++){
System.out.println(list.get(i));
}
}
}
转载于:https://my.oschina.net/lplp78/blog/93300