• 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就可以。
  • 相关阅读:
    lower版购物车模拟
    字典的增删改查和操作
    生成四位验证码
    列表的增删改查和操作
    根据输入字符串,分别计算大写,小写,数字,标点的个数
    检查一个数是不是质数
    非诚勿扰,选心动女生(小游戏)
    汉诺塔的实现
    一个纯虚函数导致的问题
    Hello World 之 CGAL
  • 原文地址:https://www.cnblogs.com/qdscwyy/p/6748375.html
Copyright © 2020-2023  润新知