hdu1016 质数环

题目链接:Prime Ring Problem

给定一个环和1~n,让你将其填到环上,使其相邻的数相加为质数。

思路:首先题目要求找出所有的情况并打印,dfs可以进行处理。考虑数组代替环存,最后放完n个数的时候加一个首尾和判断。使用dfs进行试探,如果满足条件继续深搜,不满足则回退。

dfs函数:

void dfs(int x)     //参数的含义是填了多少个数
{
    a[0]=1;
    if(x==n&&isprime(a[0]+a[n-1]))      //满足条件直接输出
    {
        for(int i=0;i<n-1;i++)
        {
            cout<<a[i]<<" "; 
        }
        cout<<a[n-1]<<endl;
    }
    else
    {
        for(int i=2;i<=n;i++)       //由于首部为1,所以从2开始进行搜索,这个循环保证所有数都能用到
        {
            if(isprime(a[x-1]+i)&&vis[i]==0)    //vis表示该数字是否被用过【因为每个数字只能用一次】
            {
                vis[i]=1;
                a[x]=i;
                dfs(x+1);                       //下一步搜索
                vis[i]=0;
            }
        }
    }
}

完整代码:

#include<bits/stdc++.h>
using namespace std;
int a[105],vis[105],n;
bool isprime(int x)
{
    for(int i=2;i*i<=x;i++)
    {
        if(x%i==0)
        {
            return 0;
        }
    }
    return 1;
}
void dfs(int x)
{
    a[0]=1;
    if(x==n&&isprime(a[0]+a[n-1]))
    {
        for(int i=0;i<n-1;i++)
        {
            cout<<a[i]<<" "; 
        }
        cout<<a[n-1]<<endl;
    }
    else
    {
        for(int i=2;i<=n;i++)
        {
            if(isprime(a[x-1]+i)&&vis[i]==0)
            {
                vis[i]=1;
                a[x]=i;
                dfs(x+1);
                vis[i]=0;
            }
        }
    }
}
int main()
{
    int cnt=1;
    while(cin>>n)
    {
        cout<<"Case "<<cnt++<<":"<<endl;
        dfs(1);
        cout<<endl;
    }
    return 0;
}

 

posted @ 2019-08-12 12:29  ~Monologue  阅读(135)  评论(0编辑  收藏  举报