HDU 1016:Prime Ring Problem(基础DFS)

来源:互联网 发布:怎么看淘宝的店铺装修 编辑:程序博客网 时间:2024/06/03 22:42

Prime Ring Problem

Time limit:2000 ms Memory limit:65536 kB OS:Linux


Problem Description

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

题意:

有n个数1~n,第一个数为1,求素数环


Code:

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#define mem(a,b) memset(a,b,sizeof(a))using namespace std;int a[25];int vis[25];bool isPrim(int n){    if(n<4)        return true;    if(n%2==0)        return false;    for(int i=3; i<=sqrt(n); i++)    {        if(n%i==0)            return false;    }    return true;}void DFS(int k,int m){    if(k==m+1)    {        if(isPrim(a[k-1]+a[1]))        {            for(int i=1; i<=m; i++)            {                printf("%d",a[i]);                if(i==m)                    printf("\n");                else                    printf(" ");            }        }        return;    }    for(int i=1; i<=m; i++)    {        if(isPrim(a[k-1]+i)&&vis[i]==0)        {            a[k]=i;            vis[i]=1;            DFS(k+1,m);            vis[i]=0;        }    }}int main(){    int n,ca=1;    while(scanf("%d",&n)!=EOF)    {        printf("Case %d:\n",ca++);        mem(vis,0);        a[1]=1;        vis[1]=1;        DFS(2,n);        printf("\n");    }    return 0;}
原创粉丝点击