zoukankan      html  css  js  c++  java
  • 全排列(求所有情况的个数)--10--全排列--蓝桥杯凑算式和leetcode46全排列

    题目描述

     
    这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。 
    比如: 
    6+8/3+952/714 就是一种解法,5+3/1+972/486 是另一种解法。 
    这个算式一共有多少种解法? 

    输出

    输出一个整数表示答案 
     
    分析
      这是一道典型的全排列算法的应用。将1~9组成的序列全排列出来,再来挑选符合算式结构的情况。
      全排列的算法思想理解1:将原序列中的每个位置的数与原序列该位置后面的每个数进行交换。
     1 #include <iostream>
     2 #include <vector>
     3 #include <stdio.h>
     4 #include <queue>
     5 #include <cmath>
     6 #include <algorithm>
     7 using namespace std;
     8 typedef long long ll;
     9 const int n = 1*2*3*4*5*6*7*8*9+5;
    10 vector<double>num[n];
    11 int sum = 0;
    12 void perm(vector<double>my,int l,int r){
    13     if(l > r){
    14         num[sum] = my;
    15         for(int i = 0;i < 9;i++)
    16               cout << my[i] <<" ";
    17         cout << endl;
    18         sum++;
    19     }
    20     else{
    21         for(int i = l;i <= r;i++){
    22             swap(my[l],my[i]);
    23             perm(my,l + 1,r);
    24             swap(my[l],my[i]);
    25         }
    26     }
    27 }
    28 int main(){
    29     vector<double>my;
    30     double a,b,c,D,E;
    31     for(int i = 0;i < 9;i++){
    32         my.push_back(i+1);
    33     }
    34     perm(my,0,8);
    35     cout << sum <<endl;
    36     int zz = sum;
    37     for(int i = 0;i < zz;i++){
    38          a = num[i][0];
    39          b = num[i][1];
    40          c = num[i][2];
    41          D = num[i][3]*100.0+num[i][4]*10.0+num[i][5];
    42          E = num[i][6]*100.0+num[i][7]*10.0+num[i][8];
    43 
    44         if(a+(b/c)+(D/E) != 10.0)
    45             sum--;
    46     }
    47     cout << sum <<endl;
    48     return 0;
    49 }
    50 
    51                 

    全排列

      给定一个 没有重复 数字的序列,返回其所有可能的全排列。

    示例:
      输入: [1,2,3]
      输出:
        [
          [1,2,3],
          [1,3,2],
          [2,1,3],
          [2,3,1],
          [3,1,2],
          [3,2,1]
        ]

    Java代码演示

     1 class Solution {
     2     List<List<Integer>> res = new ArrayList<List<Integer>>();
     3     public void swap(int[] num,int i,int j){
     4         int temp = num[i];
     5         num[i] = num[j];
     6         num[j] = temp;
     7     }
     8     public void perm(int[] nums,int left,int right){
     9         if(left > right){
    10             List<Integer> list = new ArrayList<Integer>();
    11             for(int i = 0;i < nums.length;i++){
    12                 list.add(nums[i]);
    13             }
    14             res.add(list);
    15         }
    16 
    17         for(int i = left;i <= right;i++){
    18             swap(nums,left,i);
    19             perm(nums,left+1,right);
    20             swap(nums,left,i);
    21         }
    22     }
    23     public List<List<Integer>> permute(int[] nums) {
    24         if(nums.length == 0){
    25             List<Integer> list = new ArrayList<Integer>();
    26             res.add(list);
    27             return res;
    28         }
    29         perm(nums,0,nums.length - 1);
    30         return res;
    31     }
    32 }
  • 相关阅读:
    验证或是提示字段请求值
    正则表达式模式
    Linux下squid代理缓存服务环境部署
    memcached缓存知识简单梳理
    MySQL 读写分离方案-Amoeba环境部署记录
    linux系统终端命令提示符设置(PS1)记录
    Gitlab快速部署及日常维护(社区版RPM包方式安装)
    Linux下检测IP地址冲突及解决方法
    Linux如何挂载Windows下的共享文件
    定时备份Windows文件到Linux服务器上(Rsync)
  • 原文地址:https://www.cnblogs.com/qinqin-me/p/12264041.html
Copyright © 2011-2022 走看看