package org.acm.search;
/*http://acm.nyist.net/JudgeOnline/problem.php?pid=488*/
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;
public class Search_488 {
private static int N;
// 20内两个数相加,可得的最大素数为43
private static int prime[] = new int[] { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43 };
private static int t = 1;
private static boolean vis[] = new boolean[20];// 标记是否访问过了
private static int ring[] = new int[20];// 保存素数环
public static void main(String[] args) {
Scanner sc = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
while (sc.hasNext()) {
N = sc.nextInt();
if (N == 0)
break;
// 初始化
for (int i = 0; i < 20; i++) {
Arrays.fill(vis, false);
Arrays.fill(ring, 0);
}
System.out.println("Case " + t++ + ":");
if (N == 1)
System.out.println(1);
else if (N % 2 == 1)// 奇数是不能成素数环的
System.out.println("No Answer");
else {
ring[1] = 1;
dfs(1, 2);
}
}
sc.close();
}
// 深搜
private static void dfs(int x, int count) {
if (count == N + 1 && Arrays.binarySearch(prime, 1 + ring[N]) > -1) {
for (int i = 1; i <= N; i++) {
System.out.print(ring[i] + " ");
}
System.out.println();
return;
}
for (int i = 2; i <= N; i++) {
// 回溯
if (!vis[i] && Arrays.binarySearch(prime, i + ring[count - 1]) > -1) {
vis[i] = true;
ring[count] = i;
dfs(i, count + 1);
vis[i] = false;
}
}
}
}
NYOJ-488(搜索)-题目-----------------------------素数环
最新推荐文章于 2015-03-27 10:22:54 发布