回溯法解決素數環問題
阿新 • • 發佈:2019-02-15
#include <iostream> #include <math.h> using namespace std; #define N 100000 int isp[2 * N]; int a[N]; int visited[N]; int is_prime(int n) { int i; int flag = 0; for (i = 2; i <= (int)sqrt(n) + 1;i++) { if (n%i == 0) { return 0; } } return 1; } //素數環問題 void dfs(int n, int cur) { if (cur == n && isp[a[cur - 1] + a[0]]) { for (int i = 0; i < n; i++) { cout << a[i] << " "; } cout << endl; } else for (int i = 1; i <= n; i++) { if (!visited[i] && (i==1 || isp[i + a[cur - 1]])) { a[cur] = i; visited[i] = 1; dfs(n, cur + 1); visited[i] = 0; } } } int main() { int n; cin >> n; for (int i = 2; i <= 2 * n; i++) isp[i] = is_prime(i); dfs(n, 0); return 0; }