HDU 1016 Prime Ring Problem

来源:互联网 发布:linux切换到指定目录 编辑:程序博客网 时间:2024/06/05 15:35
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.


 

Input
n (0 < n < 20).
 

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. Print solutions in lexicographical order.

You are to write a program that completes above process.

Print a blank line after each case.
 

Sample Input
68
 

Sample Output
Case 1:1 4 3 2 5 61 6 5 2 3 4Case 2:1 2 3 8 5 6 7 41 2 5 8 3 4 7 61 4 7 6 5 8 3 21 6 7 4 3 8 5 2

全排列模板需要根据实际情况稍作修改,本题的瓶颈是:剪枝过程中条件不够,以至于往外开的枝太多,占的空间多了。

#include <iostream>#include <stdio.h>#include <memory.h>#include <algorithm>#include <math.h>using namespace std;int is_prime(int m){    for(int i=2;i*i<=m;i++)    {        if(m%i==0)            return 0;    }    return 1;}void print_permution(int n,int *a,int cur){    if(cur==n)    {        int ok=1;              for(int i=0;i<n;i++)        {            if(i<n-1)            {                if(!is_prime(a[i]+a[i+1]))                {                    ok=0;                    break;                }            }            else            {                if(!is_prime(a[i]+a[0]))                    ok=0;            }        }        if(ok)        {            for(int i=0;i<n;i++)            {                if(i<n-1)                printf("%d ",a[i]);                else                    printf("%d\n",a[i]);            }        }    }    else    {        for(int i=1;i<=n;i++)        {            int ok=1;            for(int j=0;j<cur;j++)               {                    if(a[j]==i||a[0]!=1||is_prime(a[cur-1]+i)==0)                    {                         ok=0;                         break;                    }               }            if(ok)            {                a[cur]=i;                print_permution(n,a,cur+1);            }        }    }}int main(void){    int n,j=1;    while(scanf("%d",&n)!=EOF)    {        int a[50];        a[0]=1;        printf("Case %d:\n",j++);        print_permution(n,a,0);        printf("\n");    }    return 0;}


0 0
原创粉丝点击