杭电 ACM 1016

来源:互联网 发布:淘宝店升级规则 编辑:程序博客网 时间:2024/05/24 00:39

Prime Ring Problem

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 16380    Accepted Submission(s): 7445


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

此题就是要打印出一个素数环,才用回溯法解法如下

代码:

#include <stdio.h>#include <math.h>#include <string.h>int n, count;int vis[20], isp[40], A[20];int isprim(int n){    int div;    int ok = 1;    div = (int)sqrt((double)n) + 1;    for(int i = 2;i < div;i++)    {        if(n % i == 0)        {            ok = 0;            break;        }    }    if(ok)        return 1;    else        return 0;}void dfs(int cur){    if(cur == n && isp[A[0] + A[n - 1]]) // 判断出界    {        for(int i = 0;i < n;i++)        {            if(i == n - 1)                printf("%d", A[i]);            else                printf("%d ", A[i]);        }        printf("\n");    }    else        for(int i = 2;i <= n;i++)            if(!vis[i] && isp[i + A[cur - 1]])            {                A[cur] = i;                vis[i] = 1; // 标志位访问过了                dfs(cur + 1);                vis[i] = 0; // 恢复变量            }}int main(void){    for(int i = 2;i <= 40;i++)        isp[i] = isprim(i);    memset(vis, 0, sizeof(vis));    A[0] = 1;    while(scanf("%d", &n) != EOF)    {        printf("Case %d:\n", ++count);        dfs(1);        printf("\n");    }    return 0;}


 

 

原创粉丝点击