本BLOG简介(内有一道UVa524素数环进阶版)【B001】

【B001】Hi,大家好,今天我的博客第一天开通,今天奉上开博题,出自首都师师范大学附属中学OJ(题号未知在练习场中)原题为UVa524,题目要求如下:

【难度B】————————————————————————————————————————————————————————————————————————————————————————————

【题目要求】输入正整数n,用整数1,2,3,……,n 的某种排列组成一个环,使任意相邻的两数和均为素数。输出时从整数1开始逆时针排列,同一个环恰好输出一次。 有多种可能的排列,输出时按照字典序小的排列先输出的原则。

【输入要求】一个正整数n

【输入示例】

6

【输出实例】

2
1 4 3 2 5 6
1 6 5 2 3 4

【其他要求】数据范围:n〈=16

【试题分析】各位读者首先想到的是暴搜但当n为12时就已经慢得要命,此题必用回溯法(有点像dfs深搜)。

【代码】

#include <cstdio>
#include <cstring>

int A[20], vis[20];
int n;
int t=0;

int is_prime(int n)//判断质数 
{
    for(int i = 2; i*i <= n; i++)
        if(n % i == 0)   return 0;
    return 1;
}

void js(int xx)
{
    
    if(xx == n && is_prime(A[0]+A[n-1]))
    {
        t++;
		
    }
    
	
	for(int i = 2; i <= n; i++)//尝试每一个数 
        if(vis[i] == 0 && is_prime(i+A[xx-1]))//判断是否和为质数 
        {
            A[xx] = i;
            vis[i] = 1;
            js(xx+1);
            vis[i] = 0;//清除标记 
        }

}
void dfs(int cur)
{
    
    if(cur == n && is_prime(A[0]+A[n-1]))
    {
        t++;
		
    }
    
	if(cur == n && is_prime(A[0]+A[n-1]))
    {
		
		for(int i = 0; i < n; i++)
        {
			printf("%d", A[i]);//打印方案 
            printf("%s", i == n-1 ? "
" : " ");
        }
		return;
    }
	for(int i = 2; i <= n; i++)//尝试每一个数 
        if(vis[i] == 0 && is_prime(i+A[cur-1]))//判断是否和为质数 
        {
            A[cur] = i;
            vis[i] = 1;
            dfs(cur+1);
            vis[i] = 0;//清除标记 
        }

}
    
int main()//调用 
{
#ifdef LOCAL
    
#endif
	int kase = 0;
    while(scanf("%d", &n) != EOF)
    {
        memset(vis, 0, sizeof(vis));
        A[0] = 1;
        vis[1] = 1;
        js(1);
		printf("%d
", t);
		dfs(1); 
    }
	return 0;
}

 【注】此代码以AC稍有累赘,请各位读者多多指教(话说我一直粗心没看见示例中的2结果WA了4次)

原文地址:https://www.cnblogs.com/lijiaxin-blog-cpp/p/4633293.html