素数リング問題(バックトラッキング方法)

素数リングはコンピュータプログラムの問題で、1からnまでのn個の整数がリングを形成することを指します。隣接する2つの数が加算されると、結果は素数になり、リングは素数リングになります。

  ここで、nを入力し、n個の数の円の中の素数リングの数を見つけて、最初の数が1であることを指定する必要があります。

#include<iostream>
#include<math.h>
using namespace std;
int n=0;
int a[100];       //对应环 
int visit[100];  //标记数组 0表示未用 1表示已用 
int check(int k)  //判断数字x是否为整数 
{
	int i,n;
	n=(int)sqrt(k);
	for(i=2;i<=n;i++)
		if(k%i==0) return 0;
	return 1;     		
}

void dfs(int step)
{
	if(step==n&&check(a[0]+a[n-1])==1) //全部填满而且第一个元素和最后一个元素满足就输出 
	{
		for(int i=0;i<n;i++)
			cout<<a[i]<<' ';
			cout<<endl;
			return ;
	}
	else
	{
		for(int i=2;i<=n;i++)
		{
			if(visit[i]==0&&check(i+a[step-1])==1){    //i没有被占用且与前一个元素符合 
				a[step]=i;
				visit[i]=1;
				dfs(step+1);
				visit[i]=0;
			}
		}
	}
	
}
int main(void)
{
	cin>>n;
	a[0]=1;  //因为是环所以第一个元素固定 
	visit[1]=1; //1已用 
	dfs(1);	//从第一个元素开始 
	return 0;	
} 

この種のバックトラック問題は、エイトクイーンハミルトン閉路問題に似ています。

おすすめ

転載: blog.csdn.net/a447332241/article/details/88035783