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

  

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

导航