A

来源:互联网 发布:网络端游排行榜2015 编辑:程序博客网 时间:2024/05/18 09:25

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=465


题意:输入整数n,把1...n的组成环,使得相邻两个整数之和均为素数。输出排列的方案环。

思路:先生成一个素数数组,便于之后进行判断。我用的回溯法,有人说用dp哎  。

#include<stdio.h>#include<string.h>#define N 50int isp[N],n,a[20],t,vis[N];void dfs(int cur){    int i;    if( cur == n+1&&isp[a[1]+a[n]])//检验首尾之和是否为素数     {        for(i = 1; i < n; i ++)//打印环             printf("%d ",a[i]);        printf("%d\n",a[n]);    }    else    {        for(i = 2; i <= n; i ++)        {            if(!vis[i]&&isp[i+a[cur-1]])//如果这个数没有使用过并且和前一个数相加为素数             {                vis[i] = 1;//标记为使用过                 a[cur] = i;//加入环                 dfs(cur+1);//继续往下搜索                 vis[i] = 0;//取消标记             }        }    }}int prime(int x){    int i;    for(i = 2; i*i <= x; i ++)        if(x%i ==0)            return 0;    return 1;}int main(){    int i;    memset(isp,0,sizeof(isp));    for(i = 2; i <= 2*N; i ++)//预处理素数数组             if(prime(i))                isp[i] = 1;    t = 0;    while(scanf("%d",&n)!=EOF)    {        if(t)            printf("\n");        memset(vis,0,sizeof(vis));        a[1] = 1;        printf("Case %d:\n",++t);        dfs(2);    }    return 0;}

原创粉丝点击