搜索—Problem_1020-Prime Ring Problem

来源:互联网 发布:知乎精彩回答 编辑:程序博客网 时间:2024/06/05 02:18
                      搜索—Problem_1020-Prime Ring Problem

题意
有N个连续的自然数围成一圈,要求重新组合它们的顺序使得任意相邻两个数的和为素数。输出符合要求的顺序。
解题思路
采用DFS。很笨的方法,对当前一个数,展开DFS,把每一种可能的方法都罗列出来,由于所规定数不超过20,所以把40以内的素数都写到数组里,让两个数的和去跟它们比较是否相等就能判断是不是素数了,符合条件的放入数组里,完成一遍,找到合适的顺序就把它们输出。
感想
对判断素数时偷懒,写了数组然后遍历的方法比较是否为素数吗,还有输出等的语句导致代码中太多for循环使得提交时多次超时,然后把cin与cout改成了scanf与printf的形式,侥幸AC了,不过还是要对代码改进下比较好。
AC代码

#include<iostream>using namespace std;#define MAX 25int n;int visit[MAX],num[MAX];int prime_num[12]={2,3,5,7,11,13,17,19,23,29,31,37};bool is_prime(int a){    for(int i=0;i<12;i++)        if( a==prime_num[i] ) return true;    return false;}void print_num(){    for(int i=1;i<n;i++)        printf("%d ",num[i]);    printf("%d",num[n]);    }int DFS(int pre,int post,int flag){    //如果不符合,直接返回    if( !is_prime(pre+post) )  return 0;    num[flag] = post;    if( flag==n && is_prime(post+1) )    {        print_num();        printf("\n");        return 1;    }    //使用过了这个数字就标记为0    visit[post] = 0;    for(int i = 2;i<=n;i++)    if( visit[i]!=0 && DFS(post,i,flag+1) ) break;    //标记位恢复原状    visit[post] = 1;    return 0;}int main(){    int count = 1;    while( scanf("%d",&n)!=EOF )    {        for(int i = 1; i <= n; i++)        visit[i] = i;        num[1] = 1;        printf("Case %d:\n",count++);        if(n==1) printf("1\n");        for(int i = 2;i<=n;i++)            DFS(1,i,2);        printf("\n");    }    return 0;}
0 0