1..n (n≤16, 偶數) 排成環,相鄰兩數之和為質數,且首尾相鄰。按字典序輸出所有方案,1 固定在首位。
最大和 16+15=31,預計算 `isPrime[32]`。
#includeusing namespace std; bool isPrime[32]; int n, ring[17]; bool used[17]; void initPrime() { fill(isPrime, isPrime+32, true); isPrime[0]=isPrime[1]=false; for (int i=2; i*i<32; ++i) if (isPrime[i]) for (int j=i*i; j<32; j+=i) isPrime[j]=false; } void dfs(int pos) { if (pos == n) { if (isPrime[ring[n-1] + ring[0]]) { for (int i=0; i > n) { cout << "Case " << cas++ << ":\n"; fill(used, used+17, false); ring[0] = 1; used[1] = true; dfs(1); cout << "\n"; } return 0; }
最壞 O(n!),但質數約束極強,實際搜索節點極少,瞬間通過。
此題是回溯法入門經典,「質數環」約束使搜索樹極度稀疏,適合練習回溯框架與剪枝思維。