zoukankan      html  css  js  c++  java
  • Algorithm Gossip (27) 排列组合

    前言

    This Series aritcles are all based on the book 《经典算法大全》; 对于该书的所有案例进行一个探究和拓展,并且用python和C++进行实现; 目的是熟悉常用算法过程中的技巧和逻辑拓展。

    提出问题

    27.Algorithm Gossip: 排列组合

    说明

    将一组数字、字母或符号进行排列,以得到不同的组合顺序,例如1 2 3这三个数的排列组合有:1 2 3、1 3 2、2 1 3、2 3 1、3 1 2、3 2 1。

    解法

    简单的递归思路,无亮点, 关于这一点可以查阅我另外一篇小游戏的博客文章有记载 abcde通过怎么样的三次抽离到edcba, 每次只能动2个相邻的字母。

    分析和解释

    代码

    #include <stdio.h>
    #include <stdlib.h>
    #define N 4
    void perm(int*, int);
    int main(void) {
    	int num[N+1], i;
    	for(i = 1; i <= N;i++)
    		num[i] = i;
    	perm(num, 1);
    	return 0;
    	}
    void perm(int* num, int i) {
    	int j, k, tmp;
    	if(i < N){
    		for(j = i; j <= N;j++) {
    			tmp = num[j];
    			// 旋转该区段最右边数字至最左边
    			for(k = j; k > i; k--)
    				num[k] = num[k-1];
    			num[i] = tmp;
    			perm(num, i+1);
    			// 还原
    			for(k = i; k < j; k++)
    				num[k] = num[k+1];
    			num[j] = tmp;
    			}
    		}
    	else { // 显示此次排列
    		for(j = 1; j <= N;j++)
    			printf("%d ", num[j]);
    		printf("
    ");
    		}
    	}
    

    拓展和关联

    后记

    参考书籍

    • 《经典算法大全》
    • 维基百科
  • 相关阅读:
    Effective C++ 学习一
    JavaScript 定义类和继承类的基本步骤
    Vararg collection Factory Method
    apache之httpd启动、终止、重启小结
    Thinking in C++ 学习笔记[1]
    Creational Pattern 之 Abstract Factory
    Perl WEB 开发之 Template
    C语言博客作业数据类型
    C语言博客作业一二维数组
    C语言博客作业函数
  • 原文地址:https://www.cnblogs.com/actanble/p/6710893.html
Copyright © 2011-2022 走看看