素数环问题(回溯)

素数环问题描述:
问题描述:将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环。注:第1个位置恒为1

#include<stdio.h>
#include<math.h>
int n;//环内元素个数 
int p[10];//p[i]表示第i个位置的元素
//p[1]=1;//第1个位置恒为1
int hash[10]={0};//hash[i]表示i是否被访问 
int isprime(int n)//判断n是否为素数
{
	if(n<=1)
		return 0;
	int sqr=sqrt(1.0*n);
	for(int i=2;i<=sqr;++i)
		if(n%i==0)//不是素数
			return 0;
	return 1;	
} 
int check(int index,int x)//检查第index个位置放置数x是否满足条件 
{
	if(index==n)//最后一个位置
	{
		if(isprime(x+1)==1&&isprime(x+p[index-1])==1)//满足条件
			return 1; 
		else 
			return 0; 
	}
	if(isprime(x+p[index-1])==1)//满足条件 
		return 1;
	else
		return 0;
}
void g(int index)//处理第index个位置
{
	if(index==n+1)
	{
		for(int i=1;i<=n;++i)
			printf("%d ",p[i]);
		printf("\n");
	}
	for(int x=2;x<=n;++x)
	{
		if(hash[x]==0)//x未被访问
		{ 
			if(check(index,x)==1)//满足条件
			{
				hash[x]=1;//数x已被访问
				p[index]=x;//第index个位置放置了数x
				g(index+1);//处理第index+1个位置
				hash[x]=0; 
			} 
		} 
	} 
} 
int main()
{
	scanf("%d",&n);
	p[1]=1;
	g(2);
	return 0;
}
发布了42 篇原创文章 · 获赞 1 · 访问量 1631

猜你喜欢

转载自blog.csdn.net/qq_32631105/article/details/88743415
今日推荐