HDU 1016 Prime Ring Problem

分手后的思念是犯贱 2022-04-16 05:54 308阅读 0赞

原题目链接HDU1016


分类

HDU 素数 DFS


题意

输入一个数n,把1到n的自然数放到一个环里,保证相邻的两个数的和是素数。
1016-1.gif


样例输入输出

Sample Input

  1. 6
  2. 8

Sample Output

  1. Case 1:
  2. 1 4 3 2 5 6
  3. 1 6 5 2 3 4
  4. Case 2:
  5. 1 2 3 8 5 6 7 4
  6. 1 2 5 8 3 4 7 6
  7. 1 4 7 6 5 8 3 2
  8. 1 6 7 4 3 8 5 2

想法

DFS基础题,注意深搜结束条件


代码

249ms

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1111;
  4. int get_prim[maxn]={ 0};
  5. int circle[maxn],vis[maxn],n;
  6. void Get_prim(){ //素数打表 1表示不是素数
  7. get_prim[1] = 1;
  8. for(int i=2;i<=maxn;i++){
  9. if(!get_prim[i]){
  10. for(int j=i*i;j<=maxn;j+=i){
  11. get_prim[j] = 1;
  12. }
  13. }
  14. }
  15. }
  16. void dfs(int step){
  17. if(step==n+1&&!get_prim[circle[1]+circle[n]]){ //深搜结束条件
  18. for(int i=1;i<n;i++)
  19. printf("%d ",circle[i]);
  20. printf("%d\n",circle[n]);
  21. }else{
  22. for(int i=2;i<=n;i++){
  23. if(!vis[i]&&!get_prim[circle[step-1]+i]){
  24. circle[step] = i;//把符合要求的数存入数组
  25. vis[i] = 1;//标记
  26. dfs(step+1);
  27. vis[i] = 0;//回溯
  28. }
  29. }
  30. }
  31. }
  32. int main() {
  33. //freopen("in.txt","r",stdin);
  34. Get_prim();
  35. int kase=0;
  36. while(cin >> n&&n){
  37. memset(vis,0,sizeof(vis));
  38. circle[1] = 1;
  39. printf("Case %d:\n",++kase);
  40. dfs(2);
  41. printf("\n");
  42. }
  43. return 0;
  44. }

发表评论

表情:
评论列表 (有 0 条评论,308人围观)

还没有评论,来说两句吧...

相关阅读