算法——全排列

看这个算式:
☆☆☆ + ☆☆☆ = ☆☆☆
如果每个五角星代表 1 ~ 9 的不同的数字。
这个算式有多少种可能的正确填写方法?
+ 286 = 459
+ 173 = 468
+ 295 = 468
+ 492 = 675
以上都是正确的填写法!
注意:
+ 222 = 333 是错误的填写法!
因为每个数字必须是不同的!
也就是说:1~9中的所有数字,每个必须出现且仅出现一次!
注意:
不包括数字“0”!
注意:
满足加法交换率的式子算两种不同的答案。
所以答案肯定是个偶数!

public class Main{
    public static int count=0;

    public static void main(String[] args) {

        int[]A={1,2,3,4,5,6,7,8,9};
        dfs(A,0);
        System.out.println(count);

    }
    private static void dfs(int a[],int step) {
        if (step==a.length) {
            check(a);
        }else {
            for (int i = step; i < a.length; i++) {
                swap(a,step,i);
                dfs(a, step+1);
                swap(a,step,i);
            }
        }

    }
    private static void swap(int[] a, int step, int i) {
        int temp=a[i];
        a[i]=a[step];
        a[step]=temp;

    }
    private static void check(int[] A) {
        String tempA="";
        for (int i = 0; i < A.length; i++) {
            tempA+=A[i];

        }
        int a=Integer.valueOf(tempA.substring(0,3));
        int b=Integer.valueOf(tempA.substring(3,6));
        int c=Integer.valueOf(tempA.substring(6,9));
        if (a+b==c) {
            count++;
            return ;
        }

    }
}
时间: 2024-10-15 22:07:46

算法——全排列的相关文章

[算法]——全排列(Permutation)以及next_permutation

排列(Arrangement),简单讲是从N个不同元素中取出M个,按照一定顺序排成一列,通常用A(M,N)表示.当M=N时,称为全排列(Permutation).从数学角度讲,全排列的个数A(N,N)=(N)*(N-1)*...*2*1=N!,但从编程角度,如何获取所有排列?那么就必须按照某种顺序逐个获得下一个排列,通常按照升序顺序获得下一个排列. 例如对于一个集合A={1,2,3,},首先获取全排列a1: 1,2,3,:然后获取下一个排列a2: 1,3,2,:按此顺序,A的全排列如下: a1:

素数环 与 算法 全排列

在说起全排列前,先说一下昨天碰到的一个题目(答案不是我做出来的,但是我感觉有好多个亮点,贴出来方便日后的学习): 素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起见,我们规定每个素数环都从1开始.例如,下图就是6的一个素数环. 输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束. 输出 每组第一行输出对应的Case序号,从

[算法]全排列类问题

对abc三个字符进行全排列的结果是abc,acb,bac,bca,cab,cba.一种实现思路可以描述如下:step1,确定第一位的字符,可以是a,b或者c.step2,第一个字符确定之后,对剩余的字符求全排列. C++实现如下: void Permutation(char* chars,char* begin) { if(*begin=='\0') { cout << chars << endl; return; } for(char* p=begin;*p!='\0';p++)

回溯算法----全排列

给定一个 没有重复 数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]解答(C++): class Solution { public: vector<vector<int>> vec; void backTrace(vector<int> nums, int pos) { if (pos == nums.size()) { vec

算法:全排列

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenh5ODYxMTE0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" style="width:585px; height:438px"> 代码例如以下: package com.huan; import java.util.Arrays; public class Perm

全排列的生成算法

[复制转载] //全排列的生成算法 // 全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来.任何n个字符集的排列都可以与1-n的n个数字的排列一一对应, // 因此在此就以n个数字的排列为例说明排列的生成法. // n个字符的全体排列之间存在一个确定的线性顺序关系.所有的排列中除最后一个排列外,都有一个后继:除第一个排列外,都有一个前驱.每个排列的后继都可以从 // 它的前驱经过最少的变化而得到,全排列的生成算法就是从第一个排列开始逐个生成所有的排列的方

[笔面] 经典算法部分

算法理论 1. 算法的几个特征是什么.2. 算法复杂性的定义.大O.θ..小o分别表示的含义.3. 递归算法的定义.递归算法的两要素.4.分治算法的思想,经典的分治算法(全排列.二分搜索.归并排序.快速排序.线性时间选择.最接近点对问题).5. 动态规划算法解题框架,动态规划算法的两个要素是什么?备忘录方法是什么?6. 经典的动态规划问题(矩阵连乘问题.最长公共子序列问题.0-1背包问题).7. 贪心算法的思想,贪心算法的两个要素.8. 经典的贪心问题(活动安排问题.背包问题.装载问题.哈夫曼编

【转】牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会写生产者.消费者问题,完全消化理解) 5. 线程的实现方式. (也就是用户线程与内核线程的区别) 6. 用户态和核心态的区别. 7. 用户栈和内核栈的区别. 8. 内存池.进程池.线程池.(c++程序员必须掌握) 9. 死锁的概念,导致死锁的原因. 10. 导致死锁的四个必要条件. 11. 处理死锁

全排列算法 --javascript 实现

(function(){ var ret = new Array(); var A = function a(str){ if(str == undefined || str == null){return new Array();} if(str.length < 2) {return new Array(str);} if(str.length == 2) {return new Array(str[0]+str[1],str[1]+str[0]);} for(var k = 0;k <