题意:如题,注意环上的数不能重复。
思路:dfs应注意以下几点:
每次递归是在对每一个节点操作,故应建立一个1~n的最大循环。
结束条件:尝试到环上最后一个节点,且最后一个节点与第一个节点的和为素数。
进入递归前:将尝试的数标记为used,将该数填入环中。
结束递归后:将尝试的数used取消。
1 #include<stdio.h> 2 #include<cmath> 3 using namespace std; 4 int n; 5 int isprime[40] = { 6 0,0,1,1,0,1,0,1,0,0, 7 0,1,0,1,0,0,0,1,0,1, 8 0,0,0,1,0,0,0,0,0,1, 9 0,1,0,0,0,0,0,1,0,0, 10 }; 11 int ans[40]; 12 int used[40] = { 0 }; 13 14 void dfs(int cur) { 15 if (cur == n && isprime[ans[n - 1] + ans[0]]) { 16 for (int m = 0; m < n; m++) 17 printf("%d ", ans[m]); 18 printf("\n"); 19 } 20 for (int p = 2; p <= n; p++) { 21 if (!used[p]&&isprime[p + ans[cur - 1]]) { 22 used[p] = 1; 23 ans[cur] = p; 24 dfs(cur+1); 25 used[p] = 0; 26 } 27 } 28 29 } 30 int main() { 31 scanf("%d", &n); 32 ans[0] = 1; 33 34 dfs(1); 35 return 0; 36 }