JAVAクラシックアルゴリズム


アルゴリズムのプログラムの問題:同社の筆記試験の問題は1つで、10分以内に完成することを要求します.タイトルは以下の通りです:1、2、2、3、4、5のこの6つの数字で、javaで1つのmain関数を書いて、すべての異なる配列を印刷して、例えば:512234、412345など、要求:“4”は3位になることができなくて、“3”は“5”とつながることができません.
 
 
static int[] bits = new int[] { 1, 2, 3, 4, 5 };

/**
 * @param args
 */
public static void main(String[] args) {
sort("", bits);
}

private static void sort(String prefix, int[] a) {
if (a.length == 1) {
System.out.println(prefix + a[0]);
}

for (int i = 0; i < a.length; i++) {
sort(prefix + a[i], copy(a, i));
}
}

private static int[] copy(int[] a,int index){
int[] b = new int[a.length-1];
System.arraycopy(a, 0, b, 0, index);
System.arraycopy(a, index+1, b, index, a.length-index-1);
return b;
}


 
 ********************************************************************** 基本構想:1問題を図構造の遍歴問題にまとめる.実際には6つの数字が6つのノードであり、6つのノードを無方向連通図に接続し、各ノードに対してこの図形の遍歴経路を求め、すべてのノードの遍歴経路が最後にこの6つの数字の配列の組み合わせ結果セットである.2明らかにこの結果セットはまだ問題の要求に達していない.1.3,5は接続できない:実際にはこの連通図の接点3,5間は連通できないことが要求され、図構造を構築する際に条件を満たしてから図を遍歴することができる.2.重複なし:2つあることを考慮すると、重複結果が明らかに存在するため、結果セットをTreeSetに入れて重複結果をフィルタすることができる3.4.3位には入らない:この条件を満たす結果を結果セットから除去する.2 D配列を使用してグラフ構造を定義します.最後のコードは次のとおりです.
 
import java.util.Iterator;
import java.util.TreeSet;

public class TestQuestion {

private String[] b = new String[]{"1", "2", "2", "3", "4", "5"};
private int n = b.length;
private boolean[] visited = new boolean[n];
private int[][] a = new int[n][n];
private String result = "";
private TreeSet set = new TreeSet();

public static void main(String[] args) {
new TestQuestion().start();
}

private void start() {

// Initial the map a[][]
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) {
a[i][j] = 0;
} else {
    a[i][j] = 1;
}
}
}

// 3 and 5 can not be the neighbor.
a[3][5] = 0;
a[5][3] = 0;

// Begin to depth search.
for (int i = 0; i < n; i++) {
    this.depthFirstSearch(i);
}

// Print result treeset.
Iterator it = set.iterator();
while (it.hasNext()) {
String string = (String) it.next();
// "4" can not be the third position.
if (string.indexOf("4") != 2) {
System.out.println(string);
}
}
}

private void depthFirstSearch(int startIndex) {
visited[startIndex] = true;
result = result + b[startIndex];
if (result.length() == n) {
// Filt the duplicate value.
set.add(result);
}
for(int j = 0; j < n; j++) {
if (a[startIndex][j] == 1 && visited[j] == false) {
depthFirstSearch(j);
} else {
continue;
}
}

// restore the result value and visited value after listing a node.
    result = result.substring(0, result.length() -1);
    visited[startIndex] = false;
}
}