Prime Ring Problem

来源:互联网 发布:宁夏隆盛软件下载 编辑:程序博客网 时间:2024/06/06 09:59

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

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

Source
Asia 1996, Shanghai (Mainland China)
Difficulty:dfs 素数的判定;
DFS:初始状态:放了n个数
扩展方式:选一个没有选过的数且与上一个数的和是素数
目标状态:选了n个数,且第n个数和第一个数和是素数(因为首位相连)

#include <cstdio>#include <cstring>#include <algorithm>#include<cmath>using namespace std;int prime(int k){    if(k<=1) return 0;    int m=floor(sqrt(k)+0.5);    for(int i=2;i<=m;i++)    if(k%i==0)return 0;    return 1;}//素数的判断;int n;int a[100];int vis[100];void dfs(int num){    int i;    if(num==n&&prime(a[num-1]+a[0]))//目标状态:选了n个数,且第n个数和第一个数和是素数(因为首位相连)    {        for(int i=0;i<n-1;i++)        printf("%d ",a[i]);        printf("%d\n",a[num-1]);    }    else    {        for(i=2;i<=n;i++)        {            if(vis[i]==0&&prime(i+a[num-1]))//扩展方式:选一个没有选过的数且与上一个数的和是素            {vis[i]=1;             a[num++]=i;             dfs(num);             vis[i]=0;             num--;            }        }    }    return;}int main(){int c=1;  while(~scanf("%d",&n))  {printf("Case %d:\n",c);  memset(vis,0,sizeof(vis[0]));  a[0]=1;  dfs(1);//初始状态:放了n个数初始状态:放了n个数;  c++;  printf("\n");}  return 0;}
0 0
原创粉丝点击