题目链接

题意 : 就是把n个数安排在环上,要求每两个相邻的数之和一定是素数,第一个数一定是1。输出所有可能的排列。

思路 : 先打个素数表。然后循环去搜。。。。。

 1 //1016
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 
 6 using namespace std ;
 7 
 8 bool vis[21];
 9 int prime[42] ,cs[21];
10 int n ;
11 
12 void get_prime()
13 {
14     memset(prime,0,sizeof(prime));
15     prime[1] = 1 ;
16     for(int i = 2 ; i < 40 ; i ++)
17     {
18         if(prime[i] == 0)
19         {
20             for(int j = i*i ; j < 40 ; j += i)
21                 prime[j] = 1 ;
22         }
23     }
24 }
25 
26 void DFS(int s,int cnt)
27 {
28     if(cnt == n)
29     {
30         if(prime[cs[n]+1]) return ;
31         for(int i = 1 ; i <= n - 1; i++)
32             cout << cs[i] <<" " ;
33         cout << cs[ n ]<<endl ;
34         return ;
35     }
36     for(int i = 1 ; i <= n ; i++)
37     {
38         if(!vis[i] && !prime[s+i])
39         {
40             cs[++cnt] = i ;
41             vis[i] = true ;
42             DFS(i,cnt) ;
43             cnt -- ;
44             vis[i] = false ;
45         }
46     }
47 }
48 int main()
49 {
50     int casee = 1 ;
51     get_prime() ;
52     while(  cin >> n )
53     {
54         memset(vis,false,sizeof(vis)) ;
55         cout << "Case "<<casee++ <<":" << endl ;
56         vis[1] = true ;
57         cs[1] = 1;
58         DFS(1,1) ;
59         cout << endl ;
60     }
61     return 0 ;
62 }
View Code

 

posted on 2014-07-30 20:38  枫、  阅读(189)  评论(0编辑  收藏  举报