POJ 2034 Anti-prime Sequences

来源:互联网 发布:网络优化基本薪资 编辑:程序博客网 时间:2024/05/17 06:17

题意:输入m, n, d。

求出m,m+1,m+2。。。m+n的一个排列。使得任意的连续k个数之和都为合数,2<=k<=d。

思路:素数打表,然后深搜。


//196K782MS#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#define N 1005#define MAX N*10#define BUG puts("Hi") ;bool prim[MAX] ;bool flag[N] ;int ans[N] ;int m , n , d ;voidFind_Prim ( )           //筛选素数{    for ( int i = 1 ; i < MAX ; i ++ )    {        prim[i] = true ;    }    prim[1] = false ;    for ( int i = 2 ; i < MAX / 2 ; i ++ )    {        if ( prim[i] )        {             for ( int j = i + i ; j < MAX ; j += i )            {                prim[j] = false ;            }        }    }}bool Judge ( int const index , int const val )      //判断是否满足任意连续d个数为合数{    if ( 0 == index )    {        return true ;    }    int left ;    left = index - d + 1 ;    if ( left < 0 )    {        left = 0 ;    }    int sum ;    sum = val ;    for ( int i = index - 1 ; i >= left ; i -- )    {        sum += ans[i] ;        if ( prim[sum] )        {            return false ;        }    }    return true ;}bool DFS ( int const index ){    if ( index == m - n + 1 )    {        return true ;    }    for ( int i = n ; i <= m ; i ++ )    {        if ( !flag[i] )         //未标记        {            flag[i] = true ;            ans[index] = i ;            if ( Judge ( index , i ) && DFS ( index + 1 ) )            {                return true ;            }            flag[i] = false ;       //回溯         }    }    return false ;}intmain ( ){    Find_Prim ( ) ;    while ( EOF != scanf ("%d%d%d" , & n , & m , & d ) )    {        if ( 0 == n && 0 == m && 0 == d )        {            break ;        }        for ( int i = n ; i <= m ; i ++ )        {            flag[i] = false ;        }        if ( DFS ( 0 ) )        {            int i ;            for ( i = 0 ; i < m-n ; i ++ )            {                printf ("%d," , ans[i] ) ;            }            printf ("%d\n" , ans[i] ) ;        }        else        {            printf ("No anti-prime sequence exists.\n") ;        }    }    return 0 ;}