素数环最最优解

描述:

把1到20这重新排列,使得排列后的序列A满足:
a. 任意相邻两个数之和是素数
b. 不存在满足条件a的序列B使得:A和B的前k(0 <= k <= 19)项相同且B的第k+1项比A的第k+1项小。(即按字典序排列的第一项)

输入:

没有输入。

输出:

输出A,两个数字之间用一个空格隔开,第一个数字前面和最后一个数字后面没有空格。


#include<stdio.h>

#include<math.h>


int search(int n);
int prime(int x);


int a[20],bug=1;


int main()
{
search(0);
return 0;
}


int search(int n)
{
int tmp,i,j,flag=1;
if(bug==0)
{
return 0;
}
if(n==20&&bug==1)
{
tmp=a[19]+a[0];
if(prime(tmp)&&a[19]!=a[0])
{
for(i=0; i<19; i++)
{
printf("%d ",a[i]);
}
printf("%d\n",a[19]);
bug=0;
}

}
else
{
for(i=1; i<=20; i++)
{
if(n==0)
{
a[n]=i;
search(n+1);
a[n]=0;
}
else
{
flag=1;
tmp=a[n-1]+i;
for(j=0; j<n; j++)
{
if(a[j]==i||prime(tmp)==0)
{
flag=0;
break;
}
}
if(flag==1)
{
a[n]=i;
search(n+1);
a[n]=0;
}
}
}
}
}




int prime(int x)
{
int i;
for(i=2; i<=sqrt(x); i++)
{
if(x%i==0)
{
return 0;
}
}
return 1;
}
非常感谢您的提问。对于这个问题,我可以为您提供以下算法实现思路: 首先,我们需要构建一个包含所有素数的列表,以便于后续判断相邻个数的和是否为素数。可以使用筛法求素数的方法构建该列表。 接下来,我们可以使用回溯算法来实现对素数的求解。具体实现思路如下: 1. 定义一个列表 visited,记录当前已经在素数中的数字。初始状态下 visited 为空列表。 2. 定义一个函数 is_prime,判断一个数是否为素数。 3. 定义一个函数 dfs,实现对素数的搜索。dfs 函数可以接受以下参数: - current: 当前搜索到的位置,即已经在素数中的数字个数; - n: 素数中数字的总个数; - primes: 包含所有素数的列表; - visited: 当前已经在素数中的数字列表; - path: 当前搜索的路径。 4. 在 dfs 函数中,判断当前搜索到的位置是否为 n。如果是,则说明找到了一个合法的素数,将其添加到解法列表中。 5. 否则,遍历所有未访问的数字,对于每个数字,判断其与之前的数字之和是否为素数,如果是则将该数字添加到 visited 列表中,并递归调用 dfs 函数搜索下一位数字。递归调用结束后,将该数字从 visited 列表中删除,以便于尝试其他未访问的数字。 最终,搜索结束后,解法列表中记录的即为所有的素数解法。具体实现细节可以根据需要进行调整和优化。希望这个算法实现思路对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值