hdu1016Prime Ring Problem搜索素数环

搜索基础题。
虽然跟搜索图不同但是思想是一致的。
1.模拟(这里是搜索)
2.判断
3.具体要求。
这里是在每一个选项选择不同的数据也就是搜索的核心。(return!)然后判断是否符合要求,也就是和前一个数字和为素数这里由于数字不超过20,所以先预处理一下,用素数筛打表以内所有合数。最后判断不要忘记最后一个数要跟第一个数符合条件。最后在符合条件的情况输出答案即可。
几个注意点:
1.return后清理vis
2.输出记得要改变case值以及空行别由于这个pe

#include<iostream>
#include<stdio.h>
using namespace std;
#include<cstring>
#include<cmath>
int prime[45],path[25],vis[25];
int n;
void pre()
{
    memset(prime,0,sizeof(prime));
    for(int i=2;i<=sqrt(40);i++)
    {
        if(!prime[i])
        for(int j=i*i;j<=40;j+=i)
            prime[j]=1;
    }
}
void  dfs(int k)
{
    if(k==n+1&&!prime[path[k-1]+1])
    {cout<<"1";
    for(int i=2;i<=n;i++)
    cout<<" "<<path[i];
    cout<<endl;
    return;}
    int i;
    for(i=2;i<=n;i++)
    {
        if(!vis[i]&&!prime[path[k-1]+i])
        {
            path[k]=i;
            vis[i]=1;
            dfs(k+1);
            vis[i]=0;
        }
    }
    return ;
}
int main()
{
    pre();
    int ca=0;
    while(~scanf("%d",&n))
    {ca++;
    memset(path,0,sizeof(path));
    memset(vis,0,sizeof(vis));
    vis[1]=1;path[1]=1;
    printf("Case %d:\n",ca);
    dfs(2);
    cout<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43331783/article/details/88695304