Prime Ring Problem UVA - 524
题意
打印所有素数环,数值都是1-n。
思路
回溯算法,素数筛。先打表。然后dfs:先看看两数只和是不是素数(查表),然后再往下递归,另外已经用过的数字不能出现第二次,用布尔数组下标当做数,布尔值来表示能不能访问。递归完之后别忘了还原之前的数值。
import java.util.*;
class Main {
static int n;
static int[] a = new int[20];
static boolean[] visited = new boolean[20];
static int[] isPrime = new int[41];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
a[0] = 1;
int cnt = 1, times = 0;
for (int i = 2; i <= 40; i++)
isPrime[i] = 1;
for (int j = 2; j * j <= 40; j++) {
if (isPrime[j] == 1)
for (int p = j + j; p <= 40; p += j)
isPrime[p] = 0;
}
while (sc.hasNext()) {
times++;
n = sc.nextInt();
if (times!=1) System.out.println();
System.out.println("Case " + times + ":");
dfs(cnt);
}
}
public static void dfs(int cnt) {
if (cnt == n && isPrime[a[0] + a[n - 1]] == 1) {
for (int k = 0; k < n - 1; k++) {
System.out.print(a[k] + " ");
}
System.out.println(a[n - 1]);
}
for (int i = 2; i <= n; i++) {
if (isPrime[i + a[cnt - 1]] == 1 && !visited[i]) {
a[cnt++] = i;
visited[i] = true;
dfs(cnt);
a[cnt - 1] = 0;
visited[i] = false;
cnt--;
}
}
}
}