UVA - 524 Prime Ring Problem

Description

#include <cstdio>
#include <cmath>
using namespace std;

int n, t = 0;
int a[100] = {0};
int vis[50] = {0};//是否被使用过的标志
int isp[100] = {0};


int is_prime(int x)
{
   int i = 1, k;
   k = (int)sqrt(x);
   for(i = 2; i <= k; i++)
   {
        if(x%i == 0)
        {
            break;
        }
   }
    if(i <= k)
    {
        return 0;
    }
    return 1;
}

//深度优先搜素
void dfs(int cur)
{
    if (cur == n && isp[a[0]+a[n-1]])//测试第一个和最后一个数,符合即输出
    {
        printf("1");
        for (int i = 1; i < n; i++)
        {
            printf(" %d", a[i]);
        }
        printf("\n");
    }
    else
    {
        for (int i = 2; i <= n; i++)//尝试放置每一个数 i
        {
            if (!vis[i] && isp[i+a[cur-1]])//如果 i 没有用过,并且与前一个数之和为素数
             {
                a[cur] = i;
                vis[i] = 1;//设置使用标志
                dfs(cur+1);
                vis[i] = 0;//清除标志
            }
        }
    }
}

int main()
{
    for(int i = 2; i <= 50; i++)//先存放一个素数表
    {
        isp[i] = is_prime(i);//判断是否为素数的 bool
    }
    while(scanf("%d", &n) != EOF && n)
    {
        t++;
        a[0] = 1;
        if (t > 1)
            printf("\n");
        printf("Case %d:\n", t);
        dfs(1);
    }
    return 0;
}
发布了399 篇原创文章 · 获赞 440 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/Aibiabcheng/article/details/105479893
今日推荐