全排列(求所有情况的个数)--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 }
原文地址:https://www.cnblogs.com/qinqin-me/p/12264041.html