回溯法素数环

package com.supermars.practice;

import java.io.BufferedInputStream;
import java.util.Scanner;

public class 回溯法素数环 {
    static int n = 0;
    static int[] A = new int[1 << 7];
    static int[] vis = new int[1 << 7];
    static Scanner cin = new Scanner(new BufferedInputStream(System.in));

    public static void main(String[] args) {
        A[0] = 1;
        while (cin.hasNext()) {
            n = cin.nextInt();
            dfs(1);

        }

    }

    /**
     * 构建解答树
     *
     * @param cur
     *            解答树层次
     */
    private static void dfs(int cur) {
        if (cur == n && is_prim(A[0] + A[n - 1])) {
            for (int i = 0; i < n; i++) {
                System.out.print(A[i] + " ");
            }
            System.out.println("");
        } else {
            for (int i = 2; i <= n; i++) { // 尝试放置每个数
                if (vis[i] == 0 && is_prim(i + A[cur - 1])) {
                    A[cur] = i;
                    vis[i] = 1;
                    dfs(cur + 1);
                    vis[i] = 0;
                }
            }
        }

    }

    private static boolean is_prim(int ret) {
        for (int k = 3; k < ret; k++) {
            if (ret % k == 0) {
                return false;
            }
        }
        return true;
    }

}

你可能感兴趣的:(算法,数论)