首页 > 代码库 > poj 2034 Anti-prime Sequences(dfs)

poj 2034 Anti-prime Sequences(dfs)

//相邻的 2.3......d 之和都要不为素数
# include <algorithm>
# include <stdio.h>
using namespace std;
int num[1010],vis[1010];
int n,m,d,cot;
int flag[10010];
void init()//素数打表
{
	int i,j;
	for(i=2;i<10010;i++)
	{
		if(!flag[i])
			for(j=i*i;j<10010;j=j+i)
				flag[j]=true;
	}
	flag[1]=true;
	flag[0]=true;
}
bool judge()
{
	int sum,i,k;
	sum=num[cot-1];
	if(cot-d>=0)
		k=cot-d;
	else 
		k=0;
	for(i=cot-2;i>=k;i--)
	{
		sum=sum+num[i];
		if(!flag[sum])//为素数
			return true;
	}
	return false;
}
bool dfs()
{
	int i;
	if(cot>=2)
	{
		if(judge())
			return false;
	}
	if(cot==m-n+1)
		return true;
	for(i=n;i<=m;i++)
	{
		if(!vis[i])
		{
			num[cot++]=i;
			vis[i]=true;
			if(dfs())
				return true;
			vis[i]=false;
			cot--;
		}
	}
	return false;
}
int main()
{
	int i;		
	init();//初判断是否为素数
	while(~scanf("%d%d%d",&n,&m,&d),n+m+d)
	{
		memset(vis,0,sizeof(vis));
		memset(num,0,sizeof(num));
		cot=0;
		if(dfs())
		{
			for(i=0;i<cot;i++)
			{
				if(i==cot-1)
					printf("%d\n",num[i]);
				else
					printf("%d,",num[i]);
			}
		}
		else
			printf("No anti-prime sequence exists.\n");
	}
	return 0;
}

poj 2034 Anti-prime Sequences(dfs)