ZCMU-1162-松哥的素数
2017-02-03 10:52
183 查看
1162: 松哥的素数
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 128 Solved: 23
[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
【解析】
这道题如果我们用生成全排列来判断,肯定是会超时的..所以我们用回溯算法,这里要注意的是首尾也要判断,还有就是n为1的时候要输出-1,具体看代码解析。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int isprime(int n) { int i; for(i=2;i*i<=n;i++)//素数判断 { if(n%i==0) return 0; } return 1; } int a[110],vis[110],b[110],n,flag; void facs(int cur) { int i; if(cur==n&&b[a[0]+a[n-1]])//满足条件了就输出 { flag=1; for(i=0;i<n;i++) { if(i==0) printf("%d",a[i]); else printf(" %d",a[i]); } printf("\n"); return; } else { for(i=2;i<=n;i++) { if(vis[i]==0&&b[i+a[cur-1]]==1)//vis来标记这个数有没有使用过 { a[cur]=i; vis[i]=1;//标记这个数限制已经使用过了 facs(cur+1);//递归下去 vis[i]=0;//清除标记 } } } } int main() { int i; for(i=2;i<=110;i++) { b[i]=isprime(i);//判断是否是素数 } while(~scanf("%d",&n)) { 4000 flag=0; if(n==1) { printf("-1\n"); continue; } memset(vis,0,sizeof(vis)); a[0]=1; facs(1); if(flag==0) printf("-1\n"); } return 0; }
相关文章推荐
- ZCMU-1162-松哥的素数
- ZCMU1158: 松哥的二叉树
- ZCMU-1140-松哥
- ZCMU-1343-素数对
- poj 2689 线性时间筛选素数
- Php中的素数筛选
- 蓝桥杯 模拟赛 B素数个数
- poj 2262 Goldbach's Conjecture 素数筛
- 以下实例使用了嵌套循环输出2~100之间的素数
- 素数的几种方法总结
- 筛选素数
- poj 3126 Prime Path (线性素数筛 + bfs)
- C 实现一个函数判断一个数是不是素数
- hdoj.1431 素数回文 20140724
- bzoj[HAOI2007]反素数ant
- 等差素数列
- 素数回文
- 素数
- 积分赛 (一)补题——FZU - 1075 【素数】
- 分拆素数和 埃氏筛法