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

思路:

1、首先素数环,就一定要进行素数判定,考虑n<=17,可以直接暴力求出来,或者说直接可以开一个数组,把与i的和为素数的j从小到大记录下来

2、由于要输出字典序最小的方案,所以第一个一定是一,把一作为第一个数,进行深搜,用刚才预处理好的j从小到大都试一边,然后往下递归,知道找到解位置,找不到解就输出-1

代码:

#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
int isprime[],j[],ans[],vis = ,n;
vector<int> a[];
void judge_prime(){
bool judge;
for(int i = ;i <= ;i++){
isprime[i] = ;
for(int j = ;j <= i / ;j++){
if(i % j == ){
isprime[i] = ;
break;
}
}
}
}
void judge_add(){
for(int i = ;i <= n;i++){
for(int j = i+;j <= n;j++){
if(isprime[i+j]){
a[i].push_back(j);
a[j].push_back(i);
}
}
}
}
void dfs(int deep,int last){
int k;
if(deep == n){
if(!isprime[last+]) return;
for(int i = ;i <= n;i++) cout<<ans[i]<<" ";
cout<<endl;
return; }
for(int i = ;i < a[last].size();i++){
if(i >= a[last].size()) break;
k = a[last][i];
if(!j[k]){
ans[deep+] = k;
j[k] = ;
dfs(deep+,k);
j[k] = ;
}
}
}
int main(){
judge_prime();
cin>>n;
judge_add();
ans[] = ;
j[] = ;
dfs(,);
return ;
}

最新文章

  1. Material Design Reveal effect(揭示效果) 你可能见过但是叫不出名字的小效果
  2. OSG入门即osgEarth建立一个地球的详细步骤
  3. [转]C#读写TEXT文件
  4. springmvc里面的中文乱码问题
  5. C++ GUI Qt4编写的文本编辑器
  6. Linux2.6内核 -- 结构的初始化
  7. jsp中添加弹窗口并且实现向后台双向传递数据
  8. linux下LAMP环境的搭配
  9. Mac使用Gradle上传jar到中央仓库(最完整的采坑记录)
  10. 第一次AOP,附上使用DEMO,可用在简单生产环境了
  11. 【Sql Server】SQL SERVER 收缩日志
  12. 部署activiti 5.15.1的Activiti Explorer
  13. 使用Spring Cloud连接不同服务
  14. Raft 为什么是更易理解的分布式一致性算法(转)
  15. floor函数
  16. Week4-作业1:阅读笔记与思考
  17. uva 11181 - Probability|Given(概率)
  18. java中list、set和map 的区别(转)
  19. Thymeleaf使用说明
  20. php简易配置函数

热门文章

  1. Akka源码分析-Akka-Streams-概念入门
  2. c++ memset函数
  3. [C++ STL] deque使用详解
  4. 转:python中使用txt文本保存和读取变量
  5. 发生在升级OS X Yosemite后:修复各种开发环境
  6. Apache Calcite项目简介
  7. H5调用百度地图API获取地理位置
  8. CSS笔记集合
  9. overflow实现隐藏滚动条同时又可以滚动
  10. Call stack-函数调用栈