NYOJ488~素数环
来源:互联网 发布:手机上开淘宝店怎么开 编辑:程序博客网 时间:2024/06/16 10:37
思路:DFS。因为是一个环1 4 3 2 5 6和4 3 2 5 6 1是一样得所以我们把第一个数设置为1就可以避免重复。dfs得时候传一个还需要选几个数字,如果能选够k个数字,就输出答案。这个数字被选过就标记一下,用完取消标记。
注意有一个剪枝,就是奇数个数字一定不能组成素数环此时直接输出-1。因为如要组成素数环必须要一奇一偶才可以,而奇数个数不能组成这样的环,如1 2 3 4 5,5+1=6是个偶数不是素数。
但是如果只有一个数字1,是可以的。
#include<bits/stdc++.h>using namespace std;const int MAXN = 55;int n,a[MAXN];bool vis[MAXN],prime[MAXN];void dfs(int k){if(k == 0 && prime[a[n] + a[1]] == true){for(int i = n; i >= 2; i--) printf("%d ",a[i]);printf("%d\n",a[1]);return ;}for(int i = 2; i <= n; i++){if(vis[i] == false && prime[i + a[k + 1]] == true){a[k] = i;vis[i] = true;dfs(k - 1);vis[i] = false;}}}int main(){memset(prime,0,sizeof(prime));prime[2 ] = true; prime[3 ] = true; prime[5 ] = true; prime[7 ] = true; prime[11] = true; prime[13] = true; prime[17] = true; prime[19] = true; prime[23] = true; prime[29] = true; prime[31] = true; prime[37] = true; int CASE = 1;while(~scanf("%d",&n) && n){printf("Case %d:\n",CASE++);if(n == 1){ printf("1\n");continue; }//n==1的时候 if(n % 2 == 1) { printf("No Answer\n");continue; }//奇数个数字组不成素数环 memset(vis,0,sizeof(vis));a[n] = 1; vis[1] = true; //首位一定为1 dfs(n - 1); }return 0;}
阅读全文
0 0
- 素数环(nyoj488)
- nyoj488(素数环)
- NYOJ488-素数环
- NYOJ488-素数环
- nyoj488素数环
- NYOJ488素数环
- nyoj488--素数环
- nyoj488 素数环
- nyoj488素数环
- nyoj488 素数环
- nyoj488素数环
- nyoj488素数环
- nyoj488 素数环
- nyoj488 素数环
- NYOJ488~素数环
- NYOJ488 素数环 【回溯】+【预处理】
- nyoj488 素数环(dfs)
- nyoj488&&hdu1016 素数环(DFS)
- LInux 安装lepus监控系统
- kruskal算法的c++实现
- julia语言做数据预处理
- 推荐个学习python的网站
- 7.7、配置memtable阈值
- NYOJ488~素数环
- Android学习——自定义控件(1)
- 机器学习之Logistic回归
- Java内部类的继承关系和构造方法
- three.js光源的应用
- 基于UDP的P2P聊天工具 0.5——自定义消息协议
- 记忆力训练--网页小游戏
- 解决gradle长时间同步不了的一个怪方法
- HTTP method POST is not supported by this URL解决方案