链接:https://vjudge.net/problem/UVA-524
题意:给出正整数n,输出以1开头,由2到n组合的字符序列,使相邻的数相加为素数,最后一个(关键信息为n大于1小于等于16),于是可以枚举出来素数可能的个数,然后用set中的count判断是否有素数,这里需要用到n重循环,所以可以用递归
注意:递归中的参数为第几位数,每次递归与等同关系的序列无关,所以要pop出来,另外因为不能重复使用,可以使用一个fl数组来判断是否用过。
ac代码:
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
set<int>s={2,3,5,7,11,13,17,19,23,29,31};
vector<int>vec;
int n,cou=0,fl[30];
void dfs(int coun)
{
if(coun==n&&s.count(vec.back()+1)==1)
{
for(int i=0;i<vec.size();i++)
{
if(i!=0) cout<<" ";
cout<<vec[i];
}
cout<<endl;
}
else{
for(int i=2;i<=n;i++)
{
if(fl[i]==0&&s.count(i+vec.back())==1)
{
fl[i]=1;
vec.push_back(i);
dfs(coun+1);
vec.pop_back();
fl[i]=0;
}
}
}
}
int main()
{
while(cin>>n)
{
vec.clear();
memset(fl,0,sizeof(fl));
cou++;
fl[1]=1;
if(cou>1) cout<<endl;
vec.push_back(1);
printf("Case %d:\n",cou);
dfs(1);
}
return 0;
}