UVA524-Prime Ring Problem

来源:互联网 发布:疯狂安卓讲义源码 编辑:程序博客网 时间:2024/04/28 03:30

判断相邻两个数的和是不是素数,PS:还要判断数组第一个和最后一个。

一个典型的dfs,用vis来判断是否使用过,没有则加深,否则回溯。

#include<stdio.h>#include<algorithm>#include<string.h>#include<math.h>using namespace std;int isp[50],n;void cal(){    memset(isp,0,sizeof isp);    for(int i=3;i<=31;i++)    {        int k=0;        for(int j=2;j<=sqrt(i);j++)            if(i%j==0) {k=1;break;}        if(!k) isp[i]=1;    }}int A[20],vis[20];void dfs(int cur){    if(cur==n&&isp[A[0]+A[n-1]]){        for(int i=0;i<n;i++) printf(i==n-1?"%d\n":"%d ",A[i]);    }    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(){    int cas=1;    cal();    while(scanf("%d",&n)!=EOF)    {        if(cas>1)        puts("");        printf("Case %d:\n",cas++);    for(int i=0;i<n;i++)        A[i]=i+1;        memset(vis,0,sizeof vis);        dfs(1);            }    return 0;}


0 0
原创粉丝点击