poj 2034 Anti-prime Sequences

题意:输入m, n, d。

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

注意如果开始时连续数小于d时也要是合数;

用DFS暴力搜索;

View Code
#include<iostream>

#include<cstdio>

#include<cstdlib>

#include<algorithm>

#include<cmath>

#include<cstring>

using namespace std;

int num[1024],S,E,d;;

bool visit[1024],hash[10024]={0};

void Prime(  )

{

   for( int i = 2 ; i <= 100 ; i ++ )

   {

       if( hash[i] ) continue;

       for( int j = 2; j *i <=10000 ; j ++ )

            hash[i*j] = 1;         

   }

}

bool judge( int t ,int number)

{

       if( t ==0  ) return true;

       int L = t - d + 1;

       if( L < 0 ) L =0;

       int sum = number;

       for( int i = t - 1; i >= L; i -- )

       {

            sum += num[i];     

           if( !hash[sum] ) return false;

    }

   return true;

}

bool DFS( int n )

{

   if( n == E - S + 1 ) 

   {

        return true;

   }

    for( int i = S ; i <= E; i ++ )

    {

         if( !visit[i] && judge( n , i ) )

         {

            visit[i] = true;

            num[n] = i;

            if(DFS( n + 1 )) return true;

            visit[i] = false;             

         }    

    }

    return false;

}

int main(  )

{   

    Prime(  );

    while( scanf( "%d %d %d",&S,&E,&d ),S||E||d )

    {

       if( S + E + d == 0 ) break;

       memset( visit , 0 , sizeof(visit));

       if( DFS( 0 ) == false) printf( "No anti-prime sequence exists.\n" );

       else

       {

            printf( "%d",num[0] );

           for( int i = 1; i <= E - S ; i ++ )

           {

              printf( ",%d",num[i] );    

           }

           puts( "" );

       }

    }

    //system( "pause" );

    return 0;

}

 

你可能感兴趣的:(sequence)