Prime Ring Problem UVA - 524(回溯枚举子集)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leekerian/article/details/87100026

回溯记得标记的更新与返回

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;
int isp[1111]={0};

int n;
int num[111]={0};
int cont[111]={0};
void dfs(int k)
{
    if(k==n)
    {
        if(!isp[num[0]+num[k-1]])
        {
            for(int i=0;i<n-1;i++)
                cout<<num[i]<<" ";
            cout<<num[n-1]<<endl;
        }
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(cont[i])
            continue;
        if(!isp[num[k-1]+i])
        {
            num[k]=i;
            cont[i]=1;
            dfs(k+1);
            cont[i]=0;
            num[k]=0;
        }
    }
}
int main()
{   
    isp[1]=1;
    for(int i=2;i<1111;i++)
    {
        if(!isp[i])
        {
            int k=2;
            for(int j=i*k;j<1111;j=i*k)
            {
                isp[j]=1;
                k++;
            }
        }
    }
    int kase=1;
    while(cin>>n)
    {
        memset(num,0,sizeof(num));
        memset(cont,0,sizeof(cont));
        cont[1]=1;
        num[0]=1;
        if(kase!=1) cout<<endl;
        printf("Case %d:\n",kase++);
        dfs(1);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/leekerian/article/details/87100026