1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <stdio.h>

int P[12] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};
int PP[21][12];
int PQ[21] = {0};
int A[21];
char U[21] = {0};

void dfs(int x) {
    int i, j;
    if(x > 20) {
       for(i = 1; i <= 20; ++i) {
           printf("%d ", A[i]);
       }
       puts("");
    } else {
        if(x == 20) {
            for(i = 0; i < PQ[ A[x - 1] ]; ++i) {
                if(PP[ A[x - 1] ][i] == A[20]) {
                    dfs(x + 1);
                }
            }
        } else if(x == 1) {
            for(i = 1; i <= 20; ++i) {
                A[1] = i;
                U[ A[1] ] = 1;
                for(j = 0; j < PQ[ A[1] ]; ++j) {
                    if(U[ PP[ A[1] ][j] ] == 0) {
                        A[20] = PP[ A[1] ][j];
                        U[ PP[ A[1] ][j] ] = 1;
                        dfs(x + 1);
                        U[ PP[ A[1] ][j] ] = 0;
                    }
                }
            }
        } else {
            for(i = 0; i < PQ[ A[x - 1] ]; ++i) {
                if(U[ PP[ A[x - 1] ][i] ] == 0) {
                    A[x] = PP[ A[x - 1] ][i];
                    U[ PP[ A[x - 1] ][i] ] = 1;
                    dfs(x + 1);
                    U[ PP[ A[x - 1] ][i] ] = 0;
                }
            }
        }
    }
}

int main() {
    int i, j, k, p, f;
    for(i = 1; i <= 20; ++i) {
        for(j = 1; j <= 20; ++j) {
            if(i == j) {
                continue;
            }
            p = i + j;
            f = 0;
            for(k = 0; k < 12; ++k) {
                if(P[k] == p) {
                    f = 1;
                    break;
                }
            }
            if(f == 1) {
                PP[i][ PQ[i]++ ] = j;
            }
        }
    }

    dfs(1);

    return 0;
}