LandFordPairシーケンス

1412 ワード

今日LandFordPairシーケンスを聞かれ、任意のnを入力し、存在するシーケンスの種類を出力するように要求されたが、これまでn皇后のようなアルゴリズムは書かれていなかったので、その場では呆然とした顔をしていた.わざわざここに記録しておきます.
    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;
            }
        }
    }
}