A - Prime Ring Problem (素数圈)

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. 

 

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 }
 
 

 









转载于:https://www.cnblogs.com/a2985812043/p/7258448.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值