初次接触回溯法,觉得真是很好用,可以减少很多不必要的枚举。
cur变量表示进行到的当前第cur+1个数。 作为A【】的下标出现。
#include<bits/stdc++.h>
using namespace std;
int n,vis[20],isp[100],A[30],maxn=0;
void dfs(int cur) {
if(cur==n&&isp[A[0]+A[n-1]]){
for(int i=0;i<n-1;i++) printf("%d ",A[i]);
printf("%d\n",A[n-1]);
}
else for(int i=2;i<=n;i++)
if(!vis[i]&& isp[i+A[cur-1]]){
A[cur] = i;
vis[i] = 1;
dfs(cur+1);
vis[i] = 0;
}
}
void isp_2() {
int i, j;
for(i = 2; i != 50; i++)
isp[i] = 1;
for(i = 2; i != 50; i++)
for(j = i + i; j < 50; j += i)
isp[j] = 0;
}
int main() {
isp_2();
while(scanf("%d",&n)!=EOF) {
memset(vis,0,sizeof(vis));
memset(A,0,sizeof(A));
A[0]=1;
if(maxn) printf("\n");
printf("Case %d:\n",++maxn);
dfs(1);
}
return 0;
}
本文介绍了一个使用回溯法解决特定数学问题的C++程序实例。该程序的目标是在给定数量的节点上寻找一条路径,使得路径上的每个节点都表示一个素数,并且相邻节点之和也为素数。文章通过递归调用实现回溯搜索,并展示了如何筛选符合条件的素数路径。
548

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



