codeVS 1031 质数环

1031 质数环

 

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
 
 
题目描述 Description

一个大小为N(N<=17)的质数环是由1到N共N个自然数组成的一个数环,数环上每两个相邻的数字之和为质数。如下图是一个大小为6的质数环。为了方便描述,规定数环上的第一个数字总是1。如下图可用1 4 3 2 5 6来描述。若两个质数环,数字排列顺序相同则视为本质相同。现在要求你求出所有本质不同的数环。

输入描述 Input Description


只有一个数N,表示需求的质数环的大小。如:

输出描述 Output Description

每一行描述一个数环,如果有多组解,按照字典序从小到大输出。如:

样例输入 Sample Input

6

样例输出 Sample Output

1 4 3 2 5 6

1 6 5 2 3 4

数据范围及提示 Data Size & Hint
n<=17

分类标签 Tags 点此展开 

 
这个题有点水,写个DFS加回溯就AC了
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;

int prime[1000]={true};
int n;
int s[18];
bool vis[18];

void print()
{
	for(int i=1;i<=n;++i)
		cout<<s[i]<<' ';
	cout<<endl;
}

void DFS(int i)
{
	for(int j=2;j<=n;++j)
		if(!vis[j]&&prime[j+s[i-1]])
		{
			vis[j]=true;
			s[i]=j;
			if(i==n&&prime[j+1])
				print();
			else DFS(i+1);
			vis[j]=false;
		}
}

void Prime()
{
	prime[0]=prime[1]=false;
	for(int i=4;i<=n+n;i+=2)
		prime[i]=false;
	for(int i=3;i<=n+n;i+=2)
		if(prime[i])
			for(int j=i;(i*j)<(n+n);++j)
				prime[i*j]=false;
}

int main()
{
	memset(prime,true,sizeof(prime));
	cin>>n;
	Prime();
	s[1]=1;
	vis[1]=true;
	DFS(2);
	return 0;
}
其实判断指数没必要一遍遍枚举,只要用筛法筛一遍,用bool数组记录即可,筛的时候只要筛到n+n就可以。
posted @ 2017-04-22 17:17  Grary  阅读(121)  评论(0编辑  收藏  举报
博客园 首页 私信博主 编辑 关注 管理 新世界