POJ2034 Anti-prime Sequences【素数筛法】【DFS】

来源:互联网 发布:淘宝女用催情药 编辑:程序博客网 时间:2024/06/08 02:09

题目链接:

http://poj.org/problem?id=2034


题目大意:

给你三个整数 N、M、D。使得从 N 到 M 的自然数按要求排列后,相邻且连续的

D 个数内的自然数和为非素数。找到字典序最小的排列并输出,如果找不到则输出

"No anti-prime sequence exists."。


解题思路:

用深搜来做,一步一步的确定第 Cnt 个数,直到找到 M-N+1 个数,并满足要求为

止。判断相邻数的和是否为非素数可以用筛法求素数事先预处理一下。


AC代码:

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;const int MAXN = 1010;bool Prime[MAXN*10],vis[MAXN];int Ans[MAXN];int N,M,D;void IsPrime(){    Prime[0] = Prime[1] = false;    for(int i = 2; i < MAXN*10; ++i)        Prime[i] = true;    for(int i = 2; i < MAXN*10; ++i)        if(Prime[i])            for(int j = i+i; j < MAXN*10; j+=i)                Prime[j] = false;}int Judge(int Cnt,int Value){    int sum,ValueLeft;    ValueLeft = Cnt - D + 1;    if(ValueLeft < 0)        ValueLeft = 0;    sum = Value;    for(int i = Cnt-1; i >= ValueLeft; i--)    {        sum += Ans[i];        if(Prime[sum])  //连续2、3、…、D个数的和都为素数才满足            return false;    }    return true;}int Dfs(int Cnt){    if(Cnt == M-N+1)        return true;    for(int i = N; i <= M; ++i)    {        if(!vis[i] && Judge(Cnt,i))        {            Ans[Cnt] = i;            vis[i] = true;            if(Dfs(Cnt+1))                return true;            vis[i] = false;        }    }    return false;}int main(){    IsPrime();    while(~scanf("%d%d%d",&N,&M,&D) && (N||M||D))    {        memset(vis,0,sizeof(vis));        if(Dfs(0))        {            for(int i = 0; i <= M-N; ++i)                if(i != M-N)                    printf("%d,",Ans[i]);                else                    printf("%d\n",Ans[i]);        }        else            printf("No anti-prime sequence exists.\n");    }    return 0;}



0 0
原创粉丝点击