素数环
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:905 测试通过:122
总提交:905 测试通过:122
描述
输入正整数n,把整数1,2,3,…,n组成一个环,使得相邻两个整数之和为素数。输出时从整数1开始逆时针排列。同一个环应恰好输出一次。1<n≤16。
输入
输入正整数n,1<n≤16。
输出
输出素数环序列,从整数1开始逆时针排列。
样例输入
6
样例输出
1 4 3 2 5 6
1 6 5 2 3 4
题目来源
刘汝佳《算法竞赛入门经典》
分析:列举所有满足条件的排列。用递归解决。
//素数环——递归
#include<stdio.h>
#include<string.h>
int n;
int ring[16];
int a[16];
int isPrime(int x)
{
for(int i=2;i*i<=x;i++) // <=
{
if(x % i == 0)
return 0;
}
return 1;
}
int loop(int ring[], int a[], int m)
{
if(m == n && isPrime(ring[n-1] + ring[0]))
{
for(int i=0;i<n-1;i++)
printf("%d ",ring[i]);
printf("%d\n",ring[n-1]);
}
for(int i=1;i<n;i++)
{
if(a[i] == 0 && isPrime(i+1 + ring[m-1]))
{
a[i] = 1;
ring[m] = i+1;
if(loop(ring, a, m+1)) return 1;
else a[i] = 0; // 重置为0
}
}
return 0; // 失败返回0
}
int main()
{
scanf("%d",&n); // 1~n
memset(ring, 0, sizeof(ring));
memset(a, 0, sizeof(a));
ring[0] = a[0] = 1;
loop(ring, a, 1);
return 0;
}