Prime Ring 补充素数筛选表
来源:互联网 发布:淘宝刷单赚钱吗 编辑:程序博客网 时间:2024/05/22 14:52
素数环问题经单的深搜题目;
题意是这样的:
给你n个数(n<=20):1,2,3,4,5....n;把这n个数围成一个圈,每相邻的两个数之和为素数,而且,第一个数必须是1,以避免不必要的重复;
题意很简单,关键是程序的实现,这就用到了深搜;
先说什么是深搜,就是不撞南墙不回头,找准一个方向不达目的誓不罢休,也就是暴力枚举加上限制条件,再通过递归实现;
那么,说说这个题的思路:
假设n是6;
因为第一个必须是1,所以直接从第二个数找;把2放在第二个数的位置,判断1+2=3是素数,在找第三个,把3放在这里,判断2+3=5是素数;第四个放4,3+4=7是素数;第五个放5,4+5=9不是素数,第五个放6,4+6=10不是素数; 6后边没有数可用,再返回第四个,5放在第四个格子,3+=8不行;放6,3+6=9,不行,返回第三个格子,放4,2+4=6,不行;放5,2+5=7可以,再到第四个格子,注意前边已经放了1,2,5,所以这三个数不能用,放3,5+3=不行;放4,5+4=9不行,放6,5+6=11可以,第五个格子,放3,6+3=9不行,放4,6+4=10,不行,返回第五个格子,返回第四个格子,第四个格子已经试到6,返回第三个格子,放6,2+6=8不行,返回第二个格子,放3,1+3=4不行;放4,1+4=5可以,第三个格子,放2不行,放3可以;第四个格子放2可以,第五个放5可以,第六个放6可以,注意六个数虽然已经找完,但他是个环,所以还要判断最后一个和第一个的和:6+1=7可以,所以1,4,3,2,5,6是一种答案;
是不是已经看晕了呢?下面再看看这部分的实现代码:
void dsf(int step){ //step表示第几步,放第几个数; if(step==n+1){ //n个数放完,判断第一个和最后一个和是否为素数; if(prime[1+a[step-1]]) print(); return; } int i; for(i=2; i<=n; i++){ if(prime[i+a[step-1]] && !book[i]){ a[step]=i; book[i]=1; //标记该数已使用; dsf(step+1); book[i]=0;//标记清除,一定不要忘记这一步; } } return;}
其中有个素数的判断,因为范围不大,直接建个表,prime[40],是素数标记为1,反之标记为0;
void IsPrime(){//初始化prime数组全为1; int i, j; for(i=2; i<=40; i++) if(prime[i])//prime[i]==1,i是素数,则i的倍数不是素数,标记为0; for(j=i+i; j<=40; j+=i) prime[j]=0; return;}
下面奉上全部代码:
#include#include int prime[45];int book[45];int a[25];int n;void IsPrime(){ int i, j; for(i=2; i<=40; i++) if(prime[i]) for(j=i+i; j<=40; j+=i) prime[j]=0; return;}void print(){ int i; for(i=1; i<=n; i++){ if(i==n) printf("%d\n",a[i]); else printf("%d ",a[i]); } return;}void dsf(int step){ if(step==n+1){ if(prime[1+a[step-1]]) print(); return; } int i; for(i=2; i<=n; i++){ if(prime[i+a[step-1]] && !book[i]){ a[step]=i; book[i]=1; dsf(step+1); book[i]=0; } } return;}int main(){ int cnt=0; while((scanf("%d",&n))!=EOF){ cnt++; int i; printf("Case %d:\n",cnt); for(i=2; i<=40; i++){ prime[i]=1; book[i]=0; } IsPrime(); a[1]=1; book[1]=1; dsf(2); printf("\n"); } return 0;}
- Prime Ring 补充素数筛选表
- HDU Prime Ring Problem (DFS+素数打表)
- hdu1016 Prime Ring Problem dfs 素数打表
- 杭电-1016Prime Ring Problem(素数打表+DFS)
- HDU-1016 Prime Ring Problem【素数环 打表+深搜】
- POJ 3518 Prime Gap(筛选法生成素数表)
- HDU 2136 Largest prime factor(素数筛选+打表)
- HDU 1016 Prime Ring Problem 素数环
- HDU_1016 Prime Ring Problem 素数环
- hdu1016-Prime Ring Problem 素数环
- hdu1016 Prime Ring Problem 素数环
- Prime Ring Problem 素数环问题
- hdoj 1016 Prime Ring Problem【素数环】
- hdu 1016 Prime Ring Problem (素数环)
- Uva 524 Prime Ring (素数环)
- 1016-Prime Ring Problem,素数环,深搜!
- UVa524-Prime Ring Problem(DFS+素数)
- hdu 1016 Prime Ring Problem 素数环
- DCL,DDL,DML的定义与使用讲解'
- js数据类型、对象类型、位运算符
- ActionContext
- 02-数据库种类介绍及关系型数据库原理
- 嵌入式Linux学习计划
- Prime Ring 补充素数筛选表
- 补丁太旧了,新内核打不上
- virtualBox 导入 vmware 失败
- R在市场调查中的应用--主成分分析
- PAT-All Roads Lead to Rome
- js基础介绍
- NYOJ 358 取石子(五)(斐波那契博弈)
- VS简易示波器(二):自制子属性窗
- 旧版本jboss6的部署环境的配置项目发布路径