將 1..n (n<20) 排成環,相鄰兩數之和為素數,且第一個數固定為 1。按字典序輸出所有方案。
預先篩選 40 以內素數(最大和 19+20=39)。遞歸填充位置 pos,嘗試未用過的數 i,檢查 i + ring[pos-1] 是否為素數;最後檢查 ring[n-1] + ring[0]。按遞增順序嘗試自動保證字典序。
int n, ring[20], used[20];
bool isPrime[50];
void dfs(int pos) {
if (pos == n) {
if (isPrime[ring[n-1] + ring[0]]) {
for (int i=0;i1) printf("\n");
printf("Case %d:\n", caseNo++);
memset(used,0,sizeof(used));
ring[0]=1; used[1]=1;
dfs(1);
}
return 0;
}
n≤16 時方案數極少,DFS 瞬間結束。n=16 最大約 810 個方案。
HDU 1016 是經典回溯入門題。核心在於「固定首元素破對稱」+「素數表加速判斷」+「遞增枚舉產生有序解」。模板極其通用,可解決所有排列組合約束問題。