杭电1016 Prime Ring Problem

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1016

 

 

该题目的大概意思是:给定一个正整数n,在1~n这n个数中,按一定顺序组成一个圆环,要求圆环相邻两个数之和为素数,求出所有这样的组合并输出。

思路:开始想到循环列举判断,现在用DFS法

//Prime Ring Problem   #include <iostream>  #include<cmath>  using namespace std;  int prime[40]={ 0,1,1,1,0,1, 0,1,0,0,0, 1,0,1,0,0, 0,1,0,1,0, 0,0,1,0,0, 0,0,0,1,0, 1,0,0,0,0, 0,1,0,0};//手打素数表  int n; bool visit[25];//是否进行遍历的标志数组 int a[25]; //存储数字1~n void dfs(int num) { if(num==n && prime[a[0]+a[num-1]])//遍历所有数且相邻数之和为素数,则符合,输出 { for(int i=0;i<num;i++) { if(i!=num-1) cout<<a[i]<<" "; else cout<<a[i]<<endl; } } else { for(int i=2;i<=n;i++) { if(visit[i]==0)//若有未遍历的 { if(prime[i+a[num-1]])//若与已遍历的最后一个数之和为素数,符合要求 { visit[i]=1; a[num++]=i; //赋值 dfs(num); //遍历该分支 visit[i]=0; //恢复,等待下次循环遍历另一分支 num--; } } } } } int main() { int count=0; while(cin>>n) { count++; cout<<"Case "<<count<<":"<<endl; a[0]=1; dfs(1);//从根遍历 cout<<endl; } return 0; }

另外题中因为数据不多,素数表可手打,判断时也方便,也可用下面的函数代替:

2 bool IsPrime(int n)  3 {  4     for (int i = 2; i * i <= n; i++)  5         if(n % i == 0)  6             return false ;  7     return true ;  8 }

另附大神博客学习:http://blog.csdn.net/lishuhuakai/article/details/8014971

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李霁明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值