天天看点

DFS之二

//sicily 1002. Anti-prime Sequences      
#include<iostream>        //DFS,给出n,m,d,元素的取值从n到m,判断是否存在一个排列,使得在序列中任意(2,3,...d)个数的和都不是素数,如果有则输出最小的那个序列      
#include<stdio.h>      
#include<cstring>      
using namespace std;      
int n,m,d,arr[1010];      
bool prime(int s)      
{      
for(int i=2;i*i<=s;++i)      
if(s%i==0)      
return false;      
return true;      
}      
bool fit(int id,int s)        //判断元素s是否可以放在arr[i]的位置上      
{      
for(int i=id-1;i>=0&&i>=id-d+1;--i)      
{      
s+=arr[i];      
if(prime(s))      
return false;      
}      
return true;      
}      
int vis[1010],suc;      
void dfs(int id)      
{      
for(int i=n;i<=m;++i)      
if(vis[i]==0&&fit(id,i))      
{      
vis[i]=1;      
arr[id]=i;      
if(id==m-n)      
{      
suc=1;      
return ;      
}      
dfs(id+1);      
if(suc==1)      
return ;      
vis[i]=0;      
}      
}      
int main()      
{      
while(cin>>n>>m>>d&&n)      
{      
suc=0;      
memset(vis,0,sizeof(vis));      
dfs(0);      
if(suc==1)      
{      
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;      
}