一道经典的深搜题,不易写满分(素数环)

【问题描述】将1~n这n个数字首尾相连,形成一个圆环,要求圆环上任意两个相邻的数字之和都是一个素数,请编程输出符合条件的素数环。
【输入数据】输入数据仅一行,包含一个正整数n(n<=20)。
【输出数据】输出数据最多包括10行,每行由n个整数组成,表示前十个符合条件的素数环(不足十个时全部输出)。所有素数环第一个元素必须是1,且按照从小到大的顺序排列。
【输入样例】
输入
6
【输出样例】
输出
1 4 3 2 5 6

1 6 5 2 3 4

代码如下:

#include
#include
#include
#include
using namespace std;
bool f[22];
int a[22],n,ans=0;
bool pd(int x)
{
	for(int i=2;i<=trunc(sqrt(x));++i)
	if(x%i==0) return 0;
	return 1; 
}
void print()
{
	for(int i=1;i<=n;++i)
	printf("%d%s",a[i]," ");
	printf("\n");
}
void dfs(int t)
{
  if(t>n){
  	if(pd(a[n]+a[1])&&ans<10) {
  		ans++;print();
  	}
  	if(ans==10) exit(1);
  } else{
  	for(int i=2;i<=n;++i)
	{
		if (pd(a[t-1]+i)&&(f[i])&&(i!=1)) 
		{
	      a[t]=i;f[i]=0;
	     dfs(t+1);
	     f[i]=1;
		}
	}
  }
}
int main()
{
	scanf("%d",&n);
	memset(f,true,sizeof(f));a[1]=1;
	dfs(2);
}
以下几点要注意:

1、关于c++结束程序的函数,要记住是exit而不是halt,而且一定要加头文件cstdlib;

2、在进行布尔数组赋初值时,尽量用memset,但一定要加头文件cstring;

3、在写函数过程时可以随意一些,不必拘束,局部变量尽量不重复,实在重复也没关系。

你可能感兴趣的:(深度优先搜索)