Prime Ring Problem--------多重循环用递归来做

链接: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;
}

上一篇:P5658 括号树(贪心)


下一篇:存入所有影片剪辑