1. 程式人生 > >UVA 524 素數環 【dfs/回溯法】

UVA 524 素數環 【dfs/回溯法】

prim output %d set class script int 素數環 ogr

Description

A ring is composed of n (even number) circles as shown in diagram. Put natural numbers 1,2,3,...,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.

Input

n (0 < n <= 16)

Output
The 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.


You are to write a program that completes above process.

Sample Input

6
8

Sample 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


【代碼】:
/*素數環*/
#include <bits/stdc++.h>
using namespace std;
int n,prime[1005]={1},v[1005],a[1005];

void get_prime()
{
    int m=sqrt(2*n+0.5);//環-倍增
    memset(prime,1,sizeof(prime));//
0為素數 prime[0]=prime[1]=0;//非素數 for(int i=2;i<=m;i++) { if(prime[i])//素數 { for(int j=i+i;j<=2*n;j+=i) { prime[j]=0;//非素數 } } } } void dfs(int cur) { if(cur == n && prime[ a[0]+a[n-1] ]) { for(int i=0; i<n; i++) { printf("%d%c", a[i], i == n - 1 ? \n : ); } // printf("\n"); } else { for(int i=2; i<=n; i++) { if( !v[i] && prime[ i + a[cur-1] ] ) { a[cur] = i; v[i]=1; dfs(cur+1); v[i]=0; } } } } int main() { scanf("%d",&n); //初始化 memset(v,0,sizeof(v)); a[0]=1; get_prime(); dfs(1); }

UVA 524 素數環 【dfs/回溯法】