HDU 1016 Prime Ring Problem

来源:互联网 发布:手机淘宝4.0 编辑:程序博客网 时间:2024/06/08 16:53

题目地址:点击打开链接

思路:回溯,用a数组保存素数的值

AC代码:

#include<stdio.h>#include<string.h>int a[40],b[20],vis[20],n;void dfs(int cur){int i;if(cur == n && a[b[n-1]+b[0]]){for(i=0; i<n-1; i++){printf("%d ",b[i]);}printf("%d\n",b[n-1]);}else{for(i=2; i<=n; i++){if(!vis[i] && a[i+b[cur-1]]){b[cur] = i;vis[i] = 1;dfs(cur+1);vis[i] = 0;}}}}int main(){int i,j,l=1;for(i=2; i<=40; i++){for(j=2;j*j<=i;j++){if(i % j == 0){a[i] = 0;break;}}if(j*j>i)a[i] = 1;}while(scanf("%d",&n) != EOF){b[0] = 1;memset(vis,0,sizeof(vis));printf("Case %d:\n",l++);dfs(1);printf("\n");}return 0;}

AC代码2:

#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <cstring>#include <climits>#include <cmath>#include <cctype>typedef long long ll;using namespace std;int a[30];int visit[30];int isprime[40];int k=0;int n;void doprime(){    int i,j;    memset(isprime,0,sizeof(isprime));    isprime[1] = 0;    for(i=2; i<=40; i++)    {        for(j=2; j*j<=i; j++)        {            if(i % j == 0)                break;        }        if(j*j>i)            isprime[i] = 1;        else            isprime[i] = 0;    }}void dfs(int st){    int i,j;    for(i=2; i<=n; i++)    {        if(!visit[i])        {            if(isprime[i+a[st-1]])            {                if(st == n)                {                    if(isprime[i+1])                    {                        a[st] = i;                        for(j=1; j<=n-1; j++)                        {                            printf("%d ",a[j]);                        }                        printf("%d\n",i);                    }                }                else                {                    visit[i] = 1;                    a[st] = i;                    dfs(st+1);                    visit[i] = 0;                }            }        }    }}int main(){    doprime();    int cas = 1;    while(scanf("%d",&n) != EOF)    {        memset(visit,0,sizeof(visit));        a[1] = 1;        printf("Case %d:\n",cas++);        dfs(2);        printf("\n");    }    return 0;}

训练赛时做的

0 0