题目描述:
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
大体含义:有一个环,环上有几个珠子,珠子代表某个数字,不超过珠子数,且不重复。
要求输出符合(相邻珠子之和是素数的排列)
其实就是全排列问题深搜解决
只需注意 开头是1, 第一个和最后一个也要是素数。
代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int a[201], temp[201];
int book[201],n;
int is_prime( int n ) 判断素数
{
for( int i = 2; i <= sqrt(n); i++)
{
if( n % i == 0 ) return 0;
}
return n!=1;
}
void dfs( int step )
{
if( step == n+1 && is_prime(temp[n] + 1) ) 判断是否结束,第一个和最后一个之和是否是素数
{
printf("%d",temp[1]); 输出格式 最后一个数后不能带空格
for( int i = 2; i <= n ; i++ )
{
printf(" %d",temp[i]); 所以采用这种输出形式
}
printf("\n");
return ;
}
for( int i = 2; i <= n; i++) 第一步是一 从第二步开始
{
if( is_prime( a[i] + temp[step-1] ) && !book[i] )
{
temp[step] = a[i];
book[i] = 1;
dfs(step+1);
book[i] = 0;
}
}
return ;
}
int main()
{
int count = 0;
while( scanf("%d",&n)!=EOF ){
count++;
memset(book,0,sizeof(book));
memset(temp,0,sizeof(temp));
memset(a,0,sizeof(a));
for( int i = 1; i <= n; i++)
{
a[i] = i;
}
temp[1] = 1;
printf("Case %d:\n",count);
dfs(2);
printf("\n");
}
return 0;
}
430

被折叠的 条评论
为什么被折叠?



