输入正整数n,把整数1,2,3,......,n组成一个环,使得相邻来两个整数之和均为素数。输出时从整数1开始逆时针排列。同一个环应恰好输出一次。n<= 16。
此题用回溯法解决,代码如下:
#include <stdio.h>
int n;//n <= 16
//prime数组用于保存1到n中任两个数组成的素数,can数组保存满足题意的结果,vis数组用于标记
int prime[32],can[16] = {1},vis[16];//初始化can的第一个元素是1
int isPrime(int x)//判断是否为素数
{
for (int i = 2; i * i <= x; i++)
{
if (x % i == 0)
{
return 0;
}
}
return 1;
}
void fun(int cur)//递归求解
{
if (cur == n && prime[can[0] + can[n - 1]])//递归结束条件
{
for (int i = 0; i < n; i++)
{
printf("%d ",can[i]);
}
printf("\n");
}
else
{
for (int j = 2; j <= n; j++)//尝试放置每个数j
{
if (!vis[j] && prime[j + can[cur - 1]])//如果j未被放置且与前一个数和为素数
{
can[cur] = j;
vis[j] = 1;
fun(cur + 1);
vis[j] = 0;
}
}
}
}
int main()
{
scanf("%d",&n);
for (int i = 3; i < n * 2; i++)//找出可以由n个数中两个数组成的所有素数,便于后面判断
{
if (isPrime(i))
{
prime[i] = isPrime(i);
}
}
fun(1);
return 0;
}