UVA524 素数环 Prime Ring Problem

UVA好卡,没上去提,应该没什么问题

题意翻译
输入正整数 nn,把整数 1,2,\dots ,n1,2,…,n 组成一个环,使得相邻两个整数之和均为素数。输出时,从整数 11 开始逆时针排列。同一个环恰好输出一次。n\leq 16n≤16,保证一定有解。

多组数据,读入到 EOF 结束。

第 ii 组数据输出前加上一行 Case i:

相邻两组数据中间加上一个空行。

输入输出样例
输入 #1复制
6
8
输出 #1复制
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4

Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2

#include 
#include 

using namespace std;

int n;
int A[20] = {
     1,};
int vis[20] = {
     0,};
int isp[20] = {
     0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0,
                 1, 0, 1, 0, 0, 0, 1,};

void dfs(int cur);

int main()
{
     
    int cnt = 0;
    while(scanf("%d", &n) != EOF){
     
        cout << "Case " << ++cnt << ":" << endl;
        dfs(1); 
    }

    
    system("pause");
    return 0;
}

void dfs(int cur)
{
     
    //递归边界,且测试第一个数和最后一个数
    if(cur == n && isp[A[0] + A[n - 1]]){
     
        for(int i = 0; i < n; i++)
            cout << A[i] << " ";
        cout << endl;
    }
    else    //尝试放置每个数i
        for(int i = 2; i <= n; i++)   
            if(!vis[i] && isp[i + A[cur - 1]])      //如果i没有用过,并且与前一个数之和为素数
            {
     
                A[cur] = i;
                vis[i] = 1;     //设置使用标志
                dfs(cur + 1);
                vis[i] = 0;     //清除标志
            }
}

你可能感兴趣的:(UVA524 素数环 Prime Ring Problem)