http://acm.hdu.edu.cn/showproblem.php?pid=1016
题意:
已知一个数n,在1-n(包含 n ,0 < n < 20)里组合形成一个环形,使得每两个相邻的数都是素数,每次都以1为开始,输出所有情况。
样例:
6
8
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
dfs深度优先搜索入门题目,暴力搜索即可以过了
1 #include <iostream> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdio> 5 using namespace std; 6 int visited[25]; 7 int load[25]; 8 int n; 9 bool isprim(int n) 10 { 11 if (n == 3) 12 return true; 13 for (int i = 2; i<=sqrt(n); i++) 14 { 15 if (n%i == 0) 16 return false; 17 } 18 return true; 19 } 20 void dfs(int k,int v) 21 { 22 visited[v] = 1; 23 if (k == n) 24 { 25 if (isprim(v+1)) 26 { 27 load[k] = v; 28 for (int j = 0; j < n; j++) 29 { 30 printf("%d%c",load[j],j==n-1?' ':' '); 31 } 32 return ; 33 } 34 } 35 for (int i = 2; i <= n; i++) 36 { 37 if (!visited[i] && isprim(v+i)) 38 { 39 visited[i] = 1; 40 load[k] = i; 41 dfs(k+1,i); 42 visited[i] = 0; // turn back 43 //load[cnt] = 0; 44 } 45 } 46 return; 47 } 48 int main() 49 { 50 int cas = 1; 51 while (cin >> n) 52 { 53 memset(visited,0,sizeof(visited)); 54 memset(load,0,sizeof(load)); 55 load[0] = 1; 56 printf("Case %d: ",cas++); 57 dfs(1,1); 58 cout << endl; 59 } 60 return 0; 61 }