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.
Note: the number of first circle should always be 1.
Inputn (0 < n < 20).
OutputThe 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 OutpuCase 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
题目意思:
给你一个20以内的正整数n,将1到n围成一个圈,每个数都和旁边数的和为素数
输出所以可能的情况
解法:普通的应用DFS的题目,注意跳出条件就可以了;
1 #include <iostream>
2 #include <string.h>
3 using namespace std;
4
5 const int MAX = 100;
6 int n;
7 int visit[MAX];
8 int Map[MAX];
9 int a[MAX] = {3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61};
10
11 void print()
12 {
13 for(int i = 1;i <=n;i++)
14 if(i==1)
15 cout<<Map[i];
16 else
17 cout<<" "<<Map[i];
18 cout<<endl;
19 }
20
21 int pand(int x)
22 {
23 for(int i = 0;i<16;i++)
24 if(x==a[i])
25 return 1;
26 return 0;
27 }
28
29 void dfs(int x,int ti)
30 {
31 if(ti==n)
32 {
33 if(pand(x+1))
34 {
35 print();
36 }
37 }
38
39 for(int i = 2;i <= n;i++)
40 {
41 if(visit[i]==0 &&pand(i+x))
42 {
43 visit[i] = 1;
44 Map[ti+1] = i;
45 dfs(i,ti+1);
46 visit[i] = 0;
47 }
48 }
49
50 }
51
52 int main()
53 {
54 int N=0;
55 while(cin>>n)
56 {
57 cout<<"Case "<<++N<<":"<<endl;
58 if(n==1)
59 {
60 cout<<1<<'\n'<<endl;
61 continue;
62 }
63
64 memset(visit,0,sizeof(visit));
65 visit[1] = 1;
66 Map[1] = 1;
67 dfs(1,1);
68 cout<<endl;
69
70 }
71
72 return 0;
73 }