D.cpp 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int visit[41];
  4. int prime[41];
  5. int n;
  6. int a[21];
  7. int b[21];
  8. int cut = 0;
  9. int flag = 0;
  10. void Prime() {
  11. //初始化都是素数
  12. for (int i = 2; i <= 40; i++) {
  13. if (!visit[i]) {
  14. prime[++prime[0]] = i; //纪录素数, 这个prime[0] 相当于 cnt,用来计数
  15. }
  16. for (int j = 1; j <= prime[0] && i * prime[j] <= 40; j++) {
  17. visit[i * prime[j]] = 1;
  18. if (i % prime[j] == 0) {
  19. break;
  20. }
  21. }
  22. }
  23. }
  24. void dfs(int k) {
  25. if (cut == 1) {
  26. return;
  27. }
  28. if (k == n + 1 && visit[a[1] + a[n]] == 0) {
  29. for (int i = 1; i <= n; i++) {
  30. cout << a[i] << " ";
  31. }
  32. cout << endl;
  33. cut++;
  34. } else {
  35. for (int i = 1; i <= n; i++) //***逐个尝试
  36. {
  37. if (b[i] == 0 && visit[i + a[k - 1]] == 0) //***i没用过且满足条件
  38. {
  39. a[k] = i; //***存储当前序列
  40. b[i] = 1; //****标记
  41. dfs(k + 1); //***递归
  42. b[i] = 0; //***去除标记
  43. }
  44. }
  45. }
  46. }
  47. int main() {
  48. Prime();
  49. memset(a, 0, sizeof(a[0]));
  50. memset(b, 0, sizeof(b[0]));
  51. cin >> n;
  52. dfs(1);
  53. if (cut == 0) {
  54. cout << "no solution" << endl;
  55. }
  56. return 0;
  57. }