Chinaunix首页 | 论坛 | 博客
  • 博客访问: 77184
  • 博文数量: 32
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 284
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-26 14:00
个人简介

有梦想的人,正在努力

文章分类

全部博文(32)

文章存档

2015年(32)

我的朋友

分类: C/C++

2015-04-30 12:22:58

        这道题很简单,就是n个数排成一圈,相邻两个数加起来必须是质数。第一个一定是1。直接深度搜索。
因为n<20,所以加起来的最大的质数为37。可以直接用一个大小为40或41的(这个由自己决定)bool数组标记就行了。不用再去写个循环判断是否是质数。
另外还需要一个大小为20的数组标记其中的数是否已经被使用过。

AC代码如下:

  1. #include <iostream>
  2. using namespace std;
  3. bool isPrime[41] = {false,
  4.                     false, true, true, false, true, false, true, false, false, false,
  5.                     true, false, true, false, false, false, true, false, true, false,
  6.                     false, false, true, false, false, false, false, false, true, false,
  7.                     true, false, false, false, false, false, true, false, false, false}; //0、1和质数为false。

  8. bool isUsed[20] = {true, true, false, false, false, false, false, false, false, false,
  9.                    false, false, false, false, false, false, false, false, false, false}; //0和1都标记为用过

  10. int N, answer[20] = {0, 1};

  11. void showAnswer(void)
  12. {
  13.     for(int i = 1; i < N; ++i)
  14.         cout << answer[i] << " ";
  15.     cout << answer[N] << endl;
  16. }

  17. void dfs(int depth)
  18. {
  19.     if(isPrime[answer[N] + 1] && depth == N + 1)
  20.     {
  21.         showAnswer();
  22.         return;
  23.     }
  24.     for(int i = 2; i <= N; ++i)
  25.     {
  26.         if(isUsed[i] || !isPrime[answer[depth - 1] + i])
  27.             continue;
  28.         isUsed[i] = true; //标记为用过
  29.         answer[depth] = i;
  30.         dfs(depth + 1);
  31.         isUsed[i] = false; //取消标记
  32.     }
  33. }

  34. int main()
  35. {
  36.     int ct = 1;
  37.     while(cin >> N)
  38.     {
  39.         cout << "Case " << ct++ << ":\n";
  40.         dfs(2);   //第一个肯定是1,直接从2开始
  41.         cout << endl;
  42.     }
  43.     return 0;
  44. }


阅读(624) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~