• 本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次)

  • 相关阅读:
    263 相对布局之3— 相对布局的综合案例
    262 相对布局之2— 相对布局的属性设置
    leetcode-----110. 平衡二叉树
    leetcode-----109. 有序链表转换二叉搜索树
    leetcode-----108. 将有序数组转换为二叉搜索树
    leetcode-----107. 二叉树的层次遍历 II
    leetcode-----106. 从中序与后序遍历序列构造二叉树
    leetcode-----105. 从前序与中序遍历序列构造二叉树
    leetcode-----104. 二叉树的最大深度
    leetcode-----103. 二叉树的锯齿形层次遍历
  • 原文地址:https://www.cnblogs.com/lijiaxin-blog-cpp/p/4633293.html
Copyright © 2020-2023  润新知