杭电acm java_HDU1016(Java)

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.PrintStream;

import java.io.PrintWriter;

import java.util.Arrays;

import java.util.Scanner;

public class Main {

public static final boolean DEBUG = false;

public static long startTime = 0;

public static Scanner scanner = null;

public static PrintWriter printer = null;

/********************************************* global *************************************************/

public static final int MAX_N = 21;

public static int[] arr = new int[MAX_N];

public static boolean[] primes = new boolean[MAX_N * 2];

public static boolean[] visit = new boolean[MAX_N];

public static void main(String[] args) {

try {

System.setIn(new FileInputStream(new File("in.txt")));

System.setOut(new PrintStream(new File("out.txt")));

} catch (FileNotFoundException e) {

} finally {

scanner = null;

printer = null;

try {

scanner = new Scanner(System.in);

printer = new PrintWriter(System.out, true);

if (DEBUG) startTime = System.currentTimeMillis();

/********************************** start *************************************/

initPrimes();

int cas = 1;

while (scanner.hasNext()) {

int n = scanner.nextInt();

if (cas != 1) printer.println();

//printer.println("Case " + cas++ + ": ");printer.printf("Case %d: \n", cas++);

excute(n);

}

/*********************************** end **************************************/

if (DEBUG) showRunTime();

} finally {

scanner.close();

printer.close();

}

}

}

public static void showRunTime() {

printer.println();

printer.println("-----------------------------------------------------------");

printer.println("Runtime: " + (System.currentTimeMillis() - startTime) + "ms.");

}

/******************************************** function *******************************************/

public static void initPrimes() {

Arrays.fill(primes, true);

primes[0] = primes[1] = false;

for (int i = 2; i < MAX_N; i++) {

for (int j = i * 2; j < MAX_N * 2; j += i) {

primes[j] = false;

}

}

/*for (int i = 0; i < primes.length; i++) {printer.println(i + " : " + primes[i]);}*/

}

public static void excute(int n) {

if (n > 1 && n % 2 == 1) return; // 奇数个,根据鸽巢原理必然有两个奇数或偶数相邻,必定和为偶数不为素数arr[0] = 1;

Arrays.fill(visit, false);

visit[1] = true;

dfs(1, n);

}

public static void dfs(int id, int n) {

if (id == n) {

if (primes[1 + arr[id - 1]]) {

for (int i = 0; i < n; i++) {

if (i != 0) printer.print(" ");

printer.print(arr[i]);

}

printer.println();

}

return;

}

for (int i = 1; i <= n; i++) {

if (!visit[i] && primes[i + arr[id - 1]]) {

arr[id] = i;

visit[i] = true;

dfs(id + 1, n);

visit[i] = false;

}

}

return;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值