回溯經典之素數環問題
阿新 • • 發佈:2019-02-04
問題描述:假定有從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; }