洛谷题解UVA524 素数环

淡淡的烟草味﹌ 2022-02-27 13:26 377阅读 0赞

一、题目

https://www.luogu.org/problemnew/show/UVA524

二、分析

例1:以n = 4为例。n = 4的排列有

  1. 1,2,3,4 相邻两个数相加都是素数,符合题意
  2. 1,3,2,4 24相加不是素数,不符合题意
  3. 1,3,4,2 42相加不是素数,不符合题意
  4. 1,4,2,3 42相加不是素数,不符合题意
  5. 1,4,3,2 相邻两个数相加都是素数,符合题意。

所以正确的答案为

  1. 1,2,3,4
  2. 1,4,3,2

例2:以n = 5为例。n = 5的排列有

  1. 1,2,3,4,5 45相加不是素数,不符合题意
  2. 1,2,3,5,? 35相加不是素数,不符合题意
  3. 1,2,4,? 24相加不是素数,不符合题意
  4. 1,2,5,3,? 53相加不是素数,不符合题意
  5. 1,2,5,4,? 54相加不是素数,不符合题意
  6. 1,3,? 13相加不是素数,不符合题意
  7. 1,4,2,? 42相加不是素数,不符合题意
  8. 1,5,? 15相加不是素数,不符合题意

所以n=5时,没有答案。

三、代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,i,cnt,a[100];
  4. int prime[100];
  5. bool visited[100]; //标记visited[i]是否被用过
  6. void dfs(int pos)
  7. {
  8. for(int i=2; i<=n; i++)
  9. {
  10. if(!visited[i] && prime[a[pos-1] + i]) //i没有用过,且与上一个数的和为素数
  11. {
  12. visited[i] = true; // 标记
  13. a[pos]=i; // 存储
  14. if(pos == n) // 放完了n个数
  15. {
  16. if(prime[a[pos] + 1]) //这是一个环,所以最后一个数和第一个数1相邻
  17. {
  18. for(int j=1;j<n;j++)
  19. {
  20. printf("%d ",a[j]);
  21. }
  22. printf("%d",a[n]); //这里很恶心,行末不能有空格
  23. printf("\n");
  24. }
  25. }
  26. else
  27. {
  28. dfs(pos+1);
  29. }
  30. visited[i] = false; //回溯
  31. }
  32. }
  33. }
  34. int main()
  35. {
  36. // 素数打表
  37. prime[2]=prime[3]=prime[5]=prime[7]=prime[11]=prime[13]=prime[17]=prime[19]=prime[23]=prime[29]=prime[31]=1; //先处理一下素数
  38. while(scanf("%d",&n) == 1)
  39. {
  40. cnt++;
  41. printf("Case %d:\n",cnt);
  42. a[1]=1; //第一个数是1
  43. dfs(2); //从第二个数开始搜
  44. cout << endl;
  45. }
  46. return 0;
  47. }

少儿编程、信息学竞赛咨询请加微信307591841或QQ群581357582
信息学竞赛公众号.jpg

发表评论

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

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

相关阅读