LandFordPairシーケンス
1412 ワード
今日LandFordPairシーケンスを聞かれ、任意のnを入力し、存在するシーケンスの種類を出力するように要求されたが、これまでn皇后のようなアルゴリズムは書かれていなかったので、その場では呆然とした顔をしていた.わざわざここに記録しておきます.
分析してみると、実はとても簡単で、模型の上で1つのInteger[2*n]の配列を充填して、もし数字kが下のiに充填するならば、下のi+k+1もkを充填しなければならなくて、つまり伝説の剪定の構想です.nを...1すべての数が割り当てられます.それは条件を満たすシーケンスです.
Talk is cheap. Show me the code! ^_^
f(n) 2*n , :
1、 1...n,
2、 k, , k
, n, landFord
3,
[3, 1, 2, 1, 3, 2]
[2, 3, 1, 2, 1, 3]
分析してみると、実はとても簡単で、模型の上で1つのInteger[2*n]の配列を充填して、もし数字kが下のiに充填するならば、下のi+k+1もkを充填しなければならなくて、つまり伝説の剪定の構想です.nを...1すべての数が割り当てられます.それは条件を満たすシーケンスです.
Talk is cheap. Show me the code! ^_^
public class LandFordPair {
private static List> pairs = Lists.newArrayList();
public static void main(String[] args) {
landFord(3);
}
private static void landFord(int n) {
Integer[] a = new Integer[2 * n];
assign(n, a);
pairs.forEach(System.out::println);
}
private static void assign(int k, Integer a[]) {
// k 0 , pairs
if (k == 0) {
pairs.add(Lists.newArrayList(a));
return;
}
for (int i = 0; i < (a.length - k - 1); i++) {
if (a[i] == null && a[i + k + 1] == null) {
// k
a[i] = a[i + k + 1] = k;
// k-1
assign(k - 1, a);
// ,
a[i] = a[i + k + 1] = null;
}
}
}
}