您的位置:首页 > 其它

HDU-1016 Prime Ring Problem

2015-01-18 10:25 302 查看
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.



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

题解:前一个和当前个相加是否是素数,是素数就输出,就是按相邻相加是否素数,最后一个就和第一个判断。一定是偶数个输出。

#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;

int n;
int pic[22];
bool vis[22];
bool isprime(int num){
int up = floor(sqrt(num)+0.5);
for(int i = 2; i <= up;i++)
if(num%i == 0) return false;
return true;
}

void init(){
memset(vis,false,sizeof(vis));
vis[1] = true;
pic[1] = 1;
}

void dfs(int num){
if(num == n && isprime(pic[1]+pic
)){
for(int i = 1; i <= n-1; i++)
cout<<pic[i]<<" ";
cout<<pic
<<endl;
}else{
for(int i = 2; i <= n; i++){
if(!vis[i] && isprime(i+pic[num])){
vis[i] = true;
pic[num+1] = i;
dfs(num+1);
vis[i] = false;
}
}
}
}

int main(){
int c = 0;
while(cin>>n){
cout<<"Case "<<++c<<":"<<endl;
init();
dfs(1);
cout<<endl;
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: