pku_2034_Anti-prime Sequences

一道不错的搜索入门题.

题目大意:

给三个数,n,m,d,求 在n - m 之间,连续 d个数的合不是素数.如果有多种情况选最小的.

解题思想:

完全的暴力DFS,先打一个素数表,然后DFS对每个要加进来的数判断这个数与其前面d个数的合是否有素数即可.


源代码:

#include <myhead.h>

const int M=10011;
const int N=1001;
int n,m,d,num;
bool _hash[N],prim_hash[M];
int result[N];

void prim()
{//素数表
	memset(prim_hash,0,sizeof(prim_hash));
	prim_hash[0]=prim_hash[1]=true;
	for(int i=2;i<=100;++i) {
		if(!prim_hash[i]) {
			for(int j=i+i;j<M;j+=i)
				prim_hash[j]=true;
		}
	}
}

inline bool rec(int index,int value)
{//判断其前d个数的合是否有素数
	if(index==0)
		return true;
	int left=index-d+1;
	left=max(left,0);
	for(int i=index-1;i>=left;--i) {
		value+=result[i];
		if(!prim_hash[value])
			return false;
	}
	return true;
}

bool dfs(int index)
{//回溯法搜索
	if(index==num)
		return true;
	for(int i=n;i<=m;++i) {
		if(!_hash[i]&&rec(index,i)) {
			_hash[i]=true;
			result[index]=i;
			if(dfs(index+1)) 
				return true;
			_hash[i]=false;
		}
	}
	return false;
}

int main()
{
	prim();
	while(~scanf("%d%d%d",&n,&m,&d),n) {
		num=m-n+1;
		memset(result,0,sizeof(result));
		memset(_hash,0,sizeof(_hash));
		if(dfs(0)) {
			printf("%d",result[0]);
			for(int i=1;i<num;++i)
				printf(",%d",result[i]);
			puts("");
		}else
			puts("No anti-prime sequence exists.");
	}
	return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值