1. 程式人生 > >回溯經典之素數環問題

回溯經典之素數環問題

問題描述:假定有從1...n這n(n<=16)個數,求其中一個序列,使得相鄰兩個數的和是素數,並且第一個和最後一個數也是素數

思路

1.我們可以假定已經有一個序列滿足任意兩個數之和是素數

2.下一步要做的就是擴充這個序列,即從剩下的數中尋找一個數,使得這個數和既定序列中最後一個數的和是素數

3.如果這個數是最後一個數,那麼判斷它和第一個數相加的結果是否為素數,如果是,就列印序列,否則什麼也不做

因為要求的是環,我們可以假定從任意一個數開始,這裡假設從1開始

/*===============================================================
 @Author: ray
 @Created Time : 一  1/21 10:35:44 2013

 @File Name: 1.cc
 @Description:

================================================================*/

#include <iostream>
using namespace std;
bool vis[16];
int isp[32] = {0, 0, 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};

void dfs(int a[], int cur,int n) {
  if (cur == n) {
    if (isp[a[0] + a[n-1]]) {
      for (int i = 0; i <= n-1; i++)
        cout << a[i] << " ";
      cout << endl;
    }
  } else for (int i = 2; i <= n; i++) {
    if (!vis[i] && isp[a[cur-1]+i]) { //判斷i放入集合中是否滿足序列的要求
      a[cur] = i;
      vis[i] = true;//將i放入
      dfs(a, cur + 1, n);
      vis[i] = false;//以i為cur的序列訪問完畢,將i移出
    }
  }
}
int main() {
  int a[16];
  a[0] = 1;
  dfs(a, 1, 16);
  return 0;
}