全排列模板及历年蓝桥考题

简介: 全排列模板及历年蓝桥考题

全排列模板类型

1.数组-全排列模板

private static void f(int []arr,int k)
    {
        if(k==arr.length) {
            return;
        }
        for(int i=k;i<arr.length;i++) {
            swap(arr, i, k);
            f(arr, k+1);
            swap(arr, i, k+1);
        }
    }
    public static void swap(int [] a,int i,int k)
    {
        int temp = a[i];
        a[i] = a[k];
        a[k] = temp;


例:13年蓝桥-带分数

> 100 可以表示为带分数的形式:100 = 3 + 69258 / 714 还可以表示为:100 = 82 + 3546 / 197

> 注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。 类似这样的带分数,100 有 11 种表示法。

> 例如: 用户输入: 100 程序输出: 11

> 再例如: 用户输入: 105 程序输出: 6


代码实现:

public class test2 {
    public static int ans=0;
    public static int arr[] = {1,2,3,4,5,6,7,8,9};
    static int N ;
    public static  void main(String[]args)
    {
        Scanner s = new Scanner(System.in);
        N= s.nextInt();
        f(0);
        System.out.println(ans);
    }
    private static void f(int k)
    {
        if(k==arr.length) {
            operation();
        }
        for(int i=k;i < arr.length;i++) {
            swap(arr, i, k);
            f(k+1);
            swap(arr, i, k);
        }
    }
    public static void  operation()
    {
        for(int i =0;i<=6;i++)
        {
            for(int j =i+1;j<=7;j++)
            {
                int num1=into1(0,i);
                int num2=into1(i+1, j);
                int num3=into1(j+1, arr.length-1);
                if(num2 % num3 == 0 && num1+num2/num3==N)
                {
                    ans++;
                }
            }
        }
    }
    //一种分段的方法
    public static int into1(int i,int j)
    {
        int t= 1;
        int a =0;
        for(int m =i;m<=j;m++)
        {
            a+=arr[m]*t;
            t*=10;
        }
        return a;
    }
    public static void swap(int [] a,int i,int k)
    {
        int temp = a[i];
        a[i] = a[k];
        a[k] = temp;
    }
}


2.字符-全排列模板

class test2 {
  //字符数组
  public static char [] a = {'A','A','2','2','3','3','4','4'};
  public void dfs(char [] a,int k) 
  {
    if(k==a.length)
      return;
    for(int i =k;i<a.length;i++)
    {
      swap(a, i, k);
      dfs(a, k+1);
      swap(a, i, k);
    }
  }
  public void swap(char [] a,int m,int n)
  {
    char c = a[m];
    a[m] = a[n];
    a[n] = c;
  }
  public void yunsuan()
  {
    //
  }
}


hashset集合特点:无序,唯一性,index0f检索字符第一次出现的位置,lastindex0f() 检索字符最后一次出现的位置


例:14年蓝桥-扑克排序(字符数组)

AA223344,一共4对扑克牌。请你把它们排成一行。

要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌。

4A3A2432, 2342A3A4

请填写出所有符合要求的排列中,字典序最小的那个。

例如:

22AA3344 比 A2A23344 字典序小。当然,它们都不是满足要求的答案。

请通过浏览器提交答案。“A”一定不要用小写字母a,也不要用“1”代替。字符间一定不要留空格。

import java.util.HashSet;
import java.util.Set;
class test2
{
  static Set<String> set = new HashSet<String>();
  public static  void f(char [] a,int k)
  {
    if(k == a.length)
    {
      String s = new String(a);
      if(operation(s))
      {
        set.add(s);
      }
    }
    for(int i = k;i<a.length;i++)
    {
      swap(a, i, k);
      f(a, k+1);
      swap(a, i, k);
    }
  }
  public static boolean operation(String s)
  {
    if(s.lastIndexOf('A')-s.indexOf('A') == 2 &&
       s.lastIndexOf('2')-s.indexOf('2') == 3 &&
       s.lastIndexOf('3')-s.indexOf('3') == 4 &&
       s.lastIndexOf('4')-s.indexOf('4') == 5 )
      return true;
    return false;
  }
  public static void swap(char [] a,int i,int j)
  {
    char temp = a[i];
    a[i] = a[j];
    a[j] = temp;
  }
  public static void main(String[]args)
  {
    char [] a = {'A','A','2','2','3','3','4','4'};
    f(a, 0);
    for(String x:set)
    {
      System.out.println(x);
    }
  }
}


例:16年蓝桥-凑算式

这个算式中A-I代表1-9的数字,不同的字母代表不同的数字。

比如:

6+8/3+952/714 就是一种解法,

5+3/1+972/486 是另一种解法。

这个算式一共有多少种解法?

1029839db2794a9086d73bd9fd9fce57.png

class test2
{
  static int count = 0;
  public static void f(int [] a,int k)
  {
    if(k==9)
      if(operation(a))
        count++;
    for(int i =k;i<a.length;i++)
    {
      swap(a, i, k);
      f(a,k+1);
      swap(a, i, k);
    }
  }
  public static void swap(int [] a,int i ,int j)
  {
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
  }
  public static boolean operation(int [] a)
  {
    int x = a[5]*100+a[6]*10+a[7];
    int y = a[8]*100+a[3]*10+a[4];
    double result = a[0]+a[1]*1.0/a[2]+x*1.0/y ;
    if(result == 10)
      return true;
    return false;
  }
  public static void main(String[]args)
  {
    int a [] = {1,2,3,4,5,6,7,8,9};
    f(a, 0);
    System.out.println(count);
  }
}

方格填数

如下的10个格子

  +--+--+--+

  |  |  |  |

+--+--+--+--+

|  |  |  |  |

+--+--+--+--+

|  |  |  |

+--+--+--+

(如果显示有问题,也可以参看【图1.jpg】)

填入0~9的数字。要求:连续的两个数字不能相邻。

(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

请填写表示方案数目的整数。

注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

459eaa0d60264dca88cb1fae66cdaf5f.png

class test2
{
  static int c = 0;
  static int a [] = {0,1,2,3,4,5,6,7,8,9};
  public static void main(String[]args)
  {
    f(a, 0);
    System.out.println(c);
  }
  public static void f(int [] a,int k)
  {
    if(k==a.length) {
      if(operation()) {
        c++;
      }
    }
    for(int i =k;i<a.length;i++)
    {
      swap(a, i, k);
      f(a, k+1);
      swap(a, i, k);
    }
  }
  public static boolean operation()
  {
    if(Math.abs(a[0]-a[1]) != 1 && Math.abs(a[0]-a[3]) != 1 &&
       Math.abs(a[0]-a[4]) != 1 && Math.abs(a[0]-a[5]) != 1 &&
       Math.abs(a[1]-a[2]) != 1 && Math.abs(a[1]-a[4]) != 1 &&
       Math.abs(a[1]-a[5]) != 1 && Math.abs(a[1]-a[6]) != 1 && 
       Math.abs(a[2]-a[5]) != 1 && Math.abs(a[2]-a[6]) != 1 && Math.abs(a[3]-a[4]) != 1 &&
       Math.abs(a[3]-a[7]) != 1 && Math.abs(a[3]-a[8]) != 1 && Math.abs(a[4]-a[5]) != 1 &&
       Math.abs(a[4]-a[8]) != 1 && Math.abs(a[4]-a[7]) != 1 &&   
       Math.abs(a[4]-a[9]) != 1 && Math.abs(a[5]-a[6]) != 1 &&
       Math.abs(a[5]-a[8]) != 1 && Math.abs(a[5]-a[9]) != 1 &&
       Math.abs(a[6]-a[9]) != 1 && Math.abs(a[7]-a[8]) != 1 &&
       Math.abs(a[8]-a[9]) != 1)
      return true;
    return false;
  }
  public static void swap(int [] a,int i,int j)
  {
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
  }
}

注:参考文献:全排列

相关文章
|
C++
C++编程考题
C++编程考题
136 0
|
机器学习/深度学习 存储 算法
代码随想录训练营day30| 332.重新安排行程 51. N皇后 37. 解数独
代码随想录训练营day30| 332.重新安排行程 51. N皇后 37. 解数独
105 0
|
存储 机器学习/深度学习 算法
【第十四届蓝桥杯考前速成】必考知识点及代码模板总结,看完至少多拿50分
四、简单图论 1、单源最短路径 2、多源最短路 3、最小生成树 五、动态规划 1、0-1背包 2、完全背包 3、多重背包 4、线性DP 总结
171 0
|
算法
【蓝桥杯集训·每日一题】AcWing 3768. 字符串删减
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 双指针
81 0
|
存储 人工智能 算法
【蓝桥杯集训·最后一次周赛】AcWing 第 97 场周赛
文章目录 第一题 AcWing 4944. 热身计算 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4945. 比大小 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4946. 叶子节点 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
134 0
|
存储 机器学习/深度学习 人工智能
【蓝桥杯集训·周赛】AcWing 第94场周赛
文章目录 第一题 AcWing 4870. 装物品 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4871. 最早时刻 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4872. 最短路之和 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
79 0
|
存储 机器学习/深度学习 人工智能
【蓝桥杯集训·周赛】AcWing 第 95 场周赛
文章目录 第一题 AcWing 4873. 简单计算 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4874. 约数 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4875. 整数游戏 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
114 0
|
JavaScript BI
【蓝桥杯集训·周赛】AcWing 第96场周赛
文章目录 第一题 AcWing 4876. 完美数 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4877. 最大价值 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4878. 维护数组 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
92 0
|
存储 人工智能 BI
【蓝桥杯集训·周赛】AcWing 第91场周赛
文章目录 第一题 AcWing 4861. 构造数列 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4862. 浇花 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4861. 构造数列 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
86 0
|
存储 人工智能
【蓝桥杯集训·周赛】AcWing 第93场周赛
文章目录 第一题 AcWing 4867. 整除数 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第二题 AcWing 4868. 数字替换 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 第三题 AcWing 4869. 异或值 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解
105 0