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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章