HDU 1016 Prime Ring Problem

简单回溯法

注意:回溯法搜索全空间可不清vis数组

const int N=25;
int a[N];
bool vis[N];
int n;

bool isprime(int x)
{
    for(int i=2;i*i<=x;i++)
        if(x % i == 0)
            return false;
    return true;
}

void dfs(int u)
{
    if(u == n)
    {
        if(isprime(a[u-1]+a[0]))
        {
            cout<<a[0];
            for(int i=1;i<n;i++)
                cout<<' '<<a[i];
            cout<<endl;
        }
    }

    for(int i=2;i<=n;i++)
        if(!vis[i] && isprime(i+a[u-1]))
        {
            vis[i]=true;
            a[u]=i;
            dfs(u+1);
            vis[i]=false;
        }
}

int main()
{
    int kase=1;
    while(cin>>n)
    {
        //回溯法搜索全空间可不清vis数组
        //memset(vis,0,sizeof vis);
        a[0]=1;
        printf("Case %d:\n",kase++);

        dfs(1);
        cout<<endl;
    }
    //system("pause");
}
posted @ 2020-12-18 22:35  Dazzling!  阅读(42)  评论(0编辑  收藏  举报