c++ n的全排列递归实现

今天学到了一个递归小例子:求n的全排列

#include<bits/stdc++.h>
using namespace std;
//求n的全排列    n!组数据
/*
    每个全排列都有n个数,所以将求这n个数的全排列进行分解 :
    1-求n-1的全排列
    2-求n-2的全排列
    3-求n-3的全排列
            .
            .
            .
    n-求1的全排列
*/
    int n;
    int data[100];
//void swap(int& x,int& y){//交换两个数的值
//    int temp = x;
//    x = y;
//    y = temp;
//}
void swap(int *x,int *y){//形参为两个指针
    int temp = *x;
    x = y;
    *y = temp;
}
void solve(int t){
    int i;
    if(t == n)
    {
        for(i=1;i<=n;i++)
            cout<<data[i]<<" ";
        cout<<endl;
        return;
    }
    //前t个数的已确定 接下来确定后面的数
    for(i = t; i <= n; i++){
        //每次交换两个数的值
        swap(data[i],data[t]);
        //进入递归------->每次进入solve()即开始确认第t+1位上的数
        //当t == n 那么就进行输出这一组排列数据
        solve(t + 1);
        //还原数组为原来状态
        swap(data[i],data[t]);
    }
}
int main(){
    //初始化 数组
    memset(data,0,sizeof(data));
    cout<<"input n:";
    cin>>n;
    //数组放入值
    for(int i = 1; i <= n; i++)
        data[i]=i;
    solve(1);
}

后面继续努力,祝我,也祝各位在算法的道路上坚持下来。

原文地址:https://www.cnblogs.com/Tisou1/p/12173565.html

时间: 2024-10-08 08:16:17

c++ n的全排列递归实现的相关文章

全排列(递归与非递归实现)

全排列问题在公司笔试的时候很常见,这里介绍其递归与非递归实现. 递归算法 1.算法简述 简单地说:就是第一个数分别以后面的数进行交换 E.g:E = (a , b , c),则 prem(E)= a.perm(b,c)+ b.perm(a,c)+ c.perm(a,b) 然后a.perm(b,c)= ab.perm(c)+ ac.perm(b)= abc + acb.依次递归进行. void swap(string &pszStr,int k,int m) { if(k==m) return ;

全排列递归实现(二)

/**  * @param args  */ public static void main(String[] args) { char[] raw = "12345".toCharArray(); perm(raw, 4); // System.out.println("==========================="); // System.out.println(Arrays.toString(raw)); } static void perm(cha

uva 140 Bandwidth(全排列+递归)

快睡觉的时候1A的把序列全排列,递归暴力判断就ok啦,我改成对应的整数存了,a数组存的是所有的字符的排列, b数组存的是所有开始节点的排列,map[i][j]数组存的是i为起点,与j相邻 贴代码: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<limits.h> #include<math.h> #include<algorithm> using na

全排列 递归实现

前面我们介绍了全排列的非递归算法,现在我再来写一下全排列的递归算法: 这两种算法的算法思路并不相同.递归算法的思路比较接近于我们现实生活中的思路. 1.试想,我们只有两个数字:12.要对它进行全排列,第一种方式就是12本身,第二种,将12交换,变为21即可.这提示了我们一种交换的思路. 2.但这概括的并不全面.试想,我们要对123进行全排列.我们可以采用将1固定,"23"进行全排列,将"2"固定,对"13"进行全排列.将"3"

算法设计-全排列递归

排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 } { 2 3 1 } { 3 2 1 } { 3 1 2 } 我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致: 算法思路: (1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀): (2)出口:如果只有一个

枚举:全排列

*/--> pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;}

字符串的全排列JAVA实现

package com.kpp; /** * 求字符串的全排列 * 递归的思想 * 比如 abcde 先求出abcd的全排列,然后将e分别插入全排列的5个位置 * a 全排列 a * ab 全排列 ab ba * abd 全排列即是 cab acb abc cba bca bac * * @author kpp * */ public class QuanPaiLie { /** * @param args */ public static void main(String[] args) {

递归程序设计心得与体会

用递归设计出来的程序总是简洁易读,极具美感.但是对于刚入门的学者来说,当遇到递归场景时,自己却难以正确的设计出合理的递归程序.博主曾经也是困惑不已,写的多了,也就渐渐的熟悉了递归设计.特谈一下自己的感受,有些术语是博主自己总结,有可能有不合理之处. 学习递归程序设计,建议首先应该从小规模的递归开始研究,小规模就是说自己可以调试跟踪代码,且自己不会晕.这个过程完成之后,才能熟练掌握递归层次之间的转换,明白递归的执行过程.在这里推荐一篇文章:http://blog.chinaunix.net/uid

递归深度实战

先不说理论,先来个简单的递归小例子感受一下: 字符串的反转: #include <stdio.h> //递归字符串反转 void reverse(char* s) { if( (s != NULL) && (*s != '\0') ) { reverse(s + 1); printf("%c", *s); } } int main(int argc, char *argv[]) { reverse("12345"); printf(&qu