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;
}

 

posted @ 2012-07-13 17:01  wutaoKeen  阅读(131)  评论(0编辑  收藏  举报