ZCMU-1162-松哥的素数
2017-01-01 14:19
176 查看
1162: 松哥的素数
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 121 Solved: 21
[Submit][Status][Web
Board]
Description
松哥回家后居然玩起了填数游戏,该游戏的规则是由整数1,2,3,…,n-1,n,组成的一个环,要求相邻的两个数之和必须为素数.你能告诉松哥所有存在的环嘛?Input
多组测试数据。每组测试数据包含一个正整数n(n<=20).Output
对于每组测试数据输出所有的环,环从1开始输出,如果存在多个环,则按照字典序排序,若环不存在,则输出-1.Sample Input
6Sample Output
1 4 3 2 5 61 6 5 2 3 4
【解析】
其实这道题我一开始用全排列公式算,不过超时了...改了好久还是...好吧是我太菜了。这道题的话其实可以用dfs的我们一个一个的往下搜,如果遇到符合条件的就直接输出,我觉得这类问题和八皇后问题啊很像。包括算法也是很像的
#include<cstdio> #include<iostream> #include<algorithm> #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; int b[13]={2,3,5,7,11,13,17,19,23,29,31,37,41};//第一个和最后一个元素和的选项在这个集合当中 int a[100],flag,n; int c[100]; int facs(int a) { int i; for(i=0;i<13;i++) { if(b[i]==a)//判断是不是素数,两个数的加和因为n最大也就20,所以我们可以这么用 return 1; } return 0; } void check() { int i; if(facs(a +a[1])==0)//判断首位和尾部一不一致 return; for(i=1;i<=n;i++) { if(i==1) printf("%d",a[i]);//一致了我们就输出 else printf(" %d",a[i]); } printf("\n"); 4000 flag=1;//用来标记有没有输出过 } void dfs(int m) { int i; if(m>1) { if(facs(a[m]+a[m-1])==0) return;//判断相邻两个数之间是不是素数 } if(m==n) { check();//如果m等于n那就说明到底了 return ; } for(i=2;i<=n;i++)//i从二开始 { if(c[i]==0) { c[i]=1; a[m+1]=i;//建立一个解空间树一样的不断的递归下去求解 dfs(m+1); c[i]=0; } } } int main() { int i; while(~scanf("%d",&n)) { memset(c,0,sizeof(c)); if(n==1) { printf("-1\n"); continue; } a[1]=1; c[1]=1//先给c[1]赋1表示访问过了,好理解 flag=0; dfs(1); if(flag==0) printf("-1\n"); } return 0; }
相关文章推荐
- ZCMU-1162-松哥的素数
- ZCMU1158: 松哥的二叉树
- ZCMU-1140-松哥
- ZCMU-1343-素数对
- HDU 2521 反素数【打表】
- 一个偶数总能表示为两个素数之和。
- 算法003--求素数
- C语言求200`300之间的所有素数
- 素数 筛选获取
- 蓝桥模拟题--素数个数
- 反素数深度分析
- 一个偶数总能表示为两个素数之和(do)
- 12判断是否为素数
- poj 2886 Who Gets the Most Candies?(数据结构:线段树+DFS反素数打表)
- C语言求100~200之间的素数
- 素数个数
- 最小生成树——— 克鲁斯卡尔 hdu 1162 Eddy's picture
- 正整数N是否是素数
- POJ:2429-GCD & LCM Inverse(素数判断神题)(Millar-Rabin素性判断和Pollard-rho因子分解)
- POJ-3126-宽搜+素数筛选