Prime Ring Problem
HDU - 1016
A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Note: the number of first circle should always be 1.
Inputn (0 < n < 20).
Note: the number of first circle should always be 1.
OutputThe output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.
You are to write a program that completes above process.
Print a blank line after each case.
Sample Input
6 8Sample Output
Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 2: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2
题意:任意相邻两个数和为素数
思路:dfs
Java AC代码:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int maze[][] = new int[15][15];
static int vis[] = new int [15];
static int ans[] = new int [15];
static int pri[] = new int [50];
static int n,cnt,num;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner (System.in);
cnt = 0;
for(int i=2; i<=40; ++i)
if(pri[i] == 0)
for(int j=i+i; j<=40; j+=i)
pri[j] = 1;
/* for(int i=1;i<=40;++i)
System.out.print(pri[i]+" ");
System.out.println();*/
while(cin.hasNext()){
n = cin.nextInt();
Arrays.fill(vis, 0);
System.out.println("Case "+ ++cnt +":");
vis[1] = 1;
ans[1] = 1;
dfs(2);
System.out.println();
}
}
static void dfs(int step){
if(step==n+1){
show();
return;
}
for(int i =2;i<=n;++i){
if(vis[i]==1 || pri[i+ans[step-1]]==1) continue;
if(step ==n && pri[i+ans[1]]==1) continue;
vis[i] = 1;
ans[step] = i;
dfs(step+1);
vis[i] = 0;
ans[step] = 0;
}
}
static void show(){
for(int i=1;i<n;++i){
System.out.print(ans[i]+" ");
}
System.out.println(ans[n]);
}
}
素数筛:
k=0;
memset(pri,0,sizeof(pri));
for(int i=2;i<=1000;++i){
if(pri[i]==0)num[k++] = i;
for(int j=0;j<k&&num[j]*i<=1000;++j){
pri[num[j]*i] = 1;
if(i%num[j]==0) break;
}
}