[HDU 1016]--Prime Ring Problem(遡及)

10530 ワード


タイトルリンク:http://acm.hdu.edu.cn/showproblem.php?pid=1016
Prime Ring Problem
Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Problem Description
A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Note: the number of first circle should always be 1.
[HDU 1016]--Prime Ring Problem(回溯)
 
Input
n (0 < n < 20).
 
Output
The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.
You are to write a program that completes above process.
Print a blank line after each case.
 
Sample Input
6
8
 
Sample Output
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
 
Source
Asia 1996, Shanghai (Mainland China)
 
Recommend
JGShining   |   We have carefully selected several similar problems for you:  
1010  
1241  
1312  
1072  
1242  
 
ある整数nは、1からnまでの数字を繰り返しないようにリングに並べ、隣接する2つの数(首尾を含む)ごとの和を素数とし、素数リングと呼ぶ.
簡単にするために、各素数リングは1から始まることを規定しています.複数のテストデータがあり、各グループにn(0各グループの1行目の出力に対応するCaseシーケンス番号を1から出力します.題意叙述を満たす素数ループがあれば,小さいものから大きいものまで出力する.
 
解題構想:遡及する思想は、1つのdfsが完成して、最も穴のお父さんのは、1組の終わりに負けてから改行を加えなければならなくて、私は結果をプラスしてwaを提出していません.peなのに、いろいろな変更です.
完全に無愛になった、Orz~~~
 
コードは次のとおりです.

 1 #include <iostream>

 2 #include <cstring>

 3 using namespace std;

 4 

 5 #define maxn 40

 6 int vis[21], x[21], T, n;

 7 int prime[maxn] = { 1, 1, 0 };

 8 void init()

 9 {

10     int i, j;

11     for (i = 2; i <= maxn; i++){

12         if (!prime[i]){

13             for (j = 2; i*j <= maxn; j++)

14                 prime[i*j] = 1;

15         }

16     }

17 }

18 

19 void dfs(int cur){

20     if (cur == n&&!prime[1 + x[n - 1]]){

21         for (int i = 0; i < n; i++){

22             if (i) cout << ' ';

23             cout << x[i];

24         }

25         cout << endl;

26     }

27     else for (int i = 2; i <= n; i++){

28         if (!vis[i] && !prime[i + x[cur - 1]]){

29             x[cur] = i;

30             vis[i] = 1;

31             dfs(cur + 1);

32             vis[i] = 0;

33         }

34     }

35 }

36 

37 int main(){

38     init();

39     while (cin >> n){

40         cout << "Case " << ++T << ':' << endl;

41         if (n == 1)

42             cout << 1 << endl;

43         else if (n & 1)

44             cout << endl;

45         else{

46             memset(vis, 0, sizeof(vis));

47             x[0] = 1;

48             dfs(1);

49         }

50         cout << endl;//     pe  wa,     ,   ,   ~~~~

51     }

52     return 0;

53 }

View Code