题目:点击打开链接。
素数环问题,题意是把一个n个数序列,排成任意相邻两个数的和为素数的序列。深度优先搜索,素数的判定可以打印素数表。
#include<stdio.h>
#include<string.h>
int mstack[30],n;//存放序列
bool vis[30],prime[41]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0};//素数表
void dfs(int x,int top)
{
mstack[top]=x;
vis[x]=true;//存入元素
if(top==n-1)
{
if(prime[x+1])
{
for(int i=0;i<=top;++i)
printf("%d%c",mstack[i],i==top?'\n':' ');
}
return;
}//递归基
for(int j=1;j<=n;++j)
{
if(!vis[j]&&prime[j+x])
{
dfs(j,top+1);
vis[j]=false;
}
}
return;
}
int main()
{
int i=1;
while(scanf("%d",&n)!=EOF)
{
memset(mstack,0,sizeof(mstack));
memset(vis,false,sizeof(vis));//初始化
printf("Case %d:\n",i++);
dfs(1,0);
printf("\n");//注意格式要求
}
return 0;
}
素数表要够用,每个测试实例后要空行。