HDU 1016 Prime Ring Problem
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016
dfs进行遍历即可
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
//n最大为20,打表到40即可
int prime[40]={0,1,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};
int vis[21],a[21];
int n;
void dfs(int num){
int i;
if(num==n&&prime[a[0]+a[num-1]]){ //满足题意则输出
for(i=0;i<num-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[num-1]);
}
else{
for(i=2;i<=n;i++){ //否则从第二位起开始判断
if(vis[i]==0&&prime[i+a[num-1]]){ //没用过且与邻位加和为素数
vis[i]=1;
a[num++]=i; //加入
dfs(num);
vis[i]=0; //清除标记
num--;
}
}
}
}
int main(){
int num=0;
while(scanf("%d",&n)!=EOF){
num++;
printf("Case %d:\n",num);
memset(vis,0,sizeof(vis));
a[0]=1;
dfs(1);
printf("\n");
}
return 0;
}
参考:https://www.cnblogs.com/jiangjing/archive/2013/02/04/2891621.html