ラス×××計算方と溯法はn皇后問題の上の応用です.
今日はラスを見ました.×××アルゴリズムは、次にトレースを組み合わせて、一緒にn皇后問題に応用して、比較してみると、時間効率は確かにokです.
package test;
import java.util.Random;
public class NQueen {
public static void main(String[] args) {
int size = 24;
array = new int[size];
// lv
long startTime = System.currentTimeMillis(); //
while (!lv(size)) {
}
for (int a : array) {
System.out.print(a + " ");
}
long endTime = System.currentTimeMillis(); //
System.out.println(" : " + (endTime - startTime) + "ms");
//
startTime = System.currentTimeMillis();
drawBack(0);
for (int a : array) {
System.out.print(a + " ");
}
endTime = System.currentTimeMillis();
System.out.println(" : " + (endTime - startTime) + "ms");
// lv
startTime = System.currentTimeMillis();
b = false;
while (!lv(size / 2)) {
}
drawBack(size / 2);
for (int a : array) {
System.out.print(a + " ");
}
endTime = System.currentTimeMillis();
System.out.println(" : " + (endTime - startTime) + "ms");
}
private static int[] array;
// ×××(Las Vegas)
public static boolean lv(int n) {
Random random = new Random();
for (int a = 0; a < n; a++) {
int count = 0;
for (int b = 0; b < array.length; b++) {
if (place(array, a, b)) {
int k = random.nextInt(count + 1);
if (k == count) {
array[a] = b;
}
count++;
}
}
if (count == 0) {
return false;
}
}
return true;
}
// b
private static boolean b = false;
//
public static void drawBack(int level) {
if (level == array.length) {
b = true;
return;
} else {
for (int n = 0; n < array.length && !b; n++) {
if (place(array, level, n)) {
array[level] = n;
drawBack(level + 1);
}
}
}
}
public static boolean place(int[] array, int level, int value) {
for (int n = 0; n < level; n++) {
if (array[n] == value
|| Math.abs(n - level) == Math.abs(value - array[n])) {
return false;
}
}
return true;
}
}
加えて、個人的な見解:lvアルゴリズムは、最適解を知っている必要がありますが、正確に解を求めることができます.