sicily 1002. Anti-prime Sequences

// 题意: 给出n,m,d,元素的取值从n到m,要求满足在序列中任意(2,3,...d)个数的和都不是素数,
// 如果存在则输出字典序最小的序列,其中 1<=n<m<=1000, 2<=d<=10
#include<iostream> // DFS
#include<stdio.h>

#include<cstring>
#include <math.h>
using namespace std;
int n,m,d;
int arr[1010],vis[1010],ok;
int is_prime(int a)
{
for(int i=2;i*i<=a;++i)
if(a%i==0)
return 0;
return 1;
}
int verify(int cur,int a) //判断元素a是否可以填充在arr[cur]的位置上
{

for(int i=cur-1;i>=0&&i>=cur-d+1;--i)
{
a+=arr[i];
if(is_prime(a)) //出现和为素数的情况,不满足要求
return 0;

}
return 1;
}

void dfs(int cur)
{
for(int i=n;i<=m;++i) //试着在位置cur上填充 i
{

if(!vis[i]&&verify(cur,i))
{
vis[i]=1;
arr[cur]=i;
if(cur==m-n) //搜索完毕,下标从0到m-n,共有m-n+1个元素
{

ok=1;
return ;
}
dfs(cur+1);
if(ok)
return ;
vis[i]=0;
}
}
}
int main()
{
while(cin>>n>>m>>d&&n)
{
ok=0;
memset(vis,0,sizeof(vis));
dfs(0); //数组arr下标从0开始
if(ok)

{
printf("%d",arr[0]);
for(int i=1;i<=m-n;++i)
printf(",%d",arr[i]);
printf("\n");
}
else
printf("No anti-prime sequence exists.\n");
}
return 0;
}

posted on 2011-07-08 21:22  sysu_mjc  阅读(240)  评论(0编辑  收藏  举报

导航