輸入正整數(shù)n,把整數(shù)1,2,3,···,n組成一個(gè)環(huán),使得相鄰兩個(gè)整數(shù)之和均位素?cái)?shù)。輸出時(shí)從整數(shù)1開始逆時(shí)針排序。同一個(gè)環(huán)應(yīng)恰好輸出一次。n<=16.
樣例輸入:6樣例輸出:1 4 3 2 5 61 6 5 2 3 4枚舉排列(比較費(fèi)時(shí)間,跑到n = 16會(huì)超時(shí))#include <stdio.h>#include <algorithm>using namespace std;int PRime[33];int A[20];int is_prime(int n){ for(int i = 2; i < n; i++){ if(n % i == 0){ return 0; } } return 1;}int main(){ int n; scanf("%d", &n); for(int i = 2; i < 33; i++){ prime[i] = is_prime(i); //素?cái)?shù)表只需從3計(jì)算就可以了, 因?yàn)閮蓴?shù)相加最小是3 } for(int i = 0; i < n; i++) A[i] = i + 1; do{ int ok = 1; for(int i = 0; i < n; i++){ if(!prime[A[i] + A[(i + 1) % n]]){ //%n邊界 ok = 0; break; } } if(ok){ for(int i = 0; i < n; i++){ printf("%d ", A[i]); } printf("/n"); } } while(next_permutation(A + 1, A + n)); return 0;}利用回溯法(省時(shí)間)#include <stdio.h>#include <algorithm>using namespace std;int prime[33], vis[20] = {0};int A[20], n;int is_prime(int n){ for(int i = 2; i < n; i++){ if(n % i == 0){ return 0; } } return 1;}void dfs(int cur){ if(cur == n && prime[A[0] + A[n - 1]]){ for(int i = 0; i < n; i++){ printf("%d ", A[i]); } printf("/n"); } else { for(int i = 2; i <= n; i++){ if(!vis[i] && prime[i + A[cur - 1]]){ A[cur] = i; vis[i] = 1; dfs(cur + 1); vis[i] = 0; } } }}int main(){ A[0] = 1; scanf("%d", &n); for(int i = 2; i < 33; i++){ prime[i] = is_prime(i); //素?cái)?shù)表只需從3計(jì)算就可以了, 因?yàn)閮蓴?shù)相加最小是3 } dfs(1); return 0;}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注