精华内容
下载资源
问答
  • 数组全排列c语言实验
    2019-12-19 09:19:52

    数组全排列,c语言实验

    编程实现一个数组的全排列.要求递归实现.例如数组 a=[1,2,3]的全排列为
    1 2 3
    1 3 2
    2 1 3
    2 3 1
    3 2 1
    3 1 2

    代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    
    int count = 0;
    
    void swap(int &a, int &b) {
    	int t;
    	t = b;
    	b = a;
    	a = t;
    }
    
    void perm(int *p,int m,int n){
    		if (m == n - 1)
    		{
    			count++;
    			for (int i = 0; i < n; i++)
    				printf("%d ", p[i]);
    			printf("\n");
    		}
    		for (int i = m; i < n; i++)
    		{
    			if (i == m)//i == m时无需交换p[i]和p[m]的值
    				perm(p, m + 1, n);
    			else
    			{
    				swap(p[i], p[m]);
    				perm(p, m + 1, n);
    				swap(p[i], p[m]);
    			}
    		}
    	}
    
    int main(){
    	int n = 0;
    	int p[50];
    	printf("请输入待排列的数字,空格隔开,回车结束:");
    	do {
    		scanf_s("%d",&p[n++]);
    	} while (getchar()!='\n');
    	perm(p, 0, n);
    	printf("%d个全排列\n", count);
    	system("pause");
    	return 0;
    }
    
    更多相关内容
  • C语言实现全排列

    千次阅读 2020-12-23 18:18:55
    全排列回溯的基本思想:对当前位置依次进行与后面所有位置的一个交换,然后对交换后的当前位置之后的元素进行一个全排列全排列完毕后,进行回溯:将当前位置与之前交换的位置重新调换,形成原来的排列,然后继续...

    使用方法:回溯法

    回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 ——百度百科

    全排列回溯的基本思想:对当前位置依次进行与后面所有位置的一个交换,然后对交换后的当前位置之后的元素进行一个全排列,全排列完毕后,进行回溯:将当前位置与之前交换的位置重新调换,形成原来的排列,然后继续进行下一次交换。

    比如我们想要对[1, 2, 3, 4, 5]进行排列,首先确定第一位数,可以是1, 2, 3 , 4 ,5中任意一个,下图中我们与3进行交换,那么交换后的后四个数就是[2, 1, 4, 5],然后对这个数组进行全排列(递归),最后回溯之后就会回到[1, 2, 3, 4, 5](每次排列都会回溯,所以最外层回溯的时候的排列和起初一定是一样的),接下来把4作为首位,需要排列的数就是[2, 3, 1, 5],依次类推。

    在这里插入图片描述

    全部代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    
    void permute(int *list, int begin, int size); // 实现全排列的函数
    void swap(int *a, int *b); // 交换数组中两个数的值
    
    int num = 0; // 记录全排列的次数
    
    int main()
    {
        int n;
        int *list;
        printf("Input the size of the number list: ");
        scanf("%d", &n);
        list = (int*)calloc(n, sizeof(int)); // 动态数组
        // 初始化
        printf("Input the number list:\n");
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &list[i]);
        }
    
        permute(list, 0, n);
    
        printf("The total number of permutation is %d", num);
        free(list); // 释放
    }
    
    void permute(int *list, int begin, int size)
    {
        if (begin >= size) {
            // a permutation is found
            num++;
            for (int i = 0; i < size; i++)
            {
                printf("%d ", list[i]);
            }
            printf("\n");
            return;
        }
        for (int k = begin; k < size; k++)
        {
            if (k != begin) swap(&list[begin], &list[k]);
            permute(list, begin+1, size);
            if (k != begin) swap(&list[begin], &list[k]);
        }
    }
    
    void swap(int *a, int *b)
    {
        int temp = *a;
        *a = *b;
        *b = temp;
    }
    
    展开全文
  • 递归实现数组全排列

    千次阅读 2015-09-13 19:24:26
    设计一个递归算法求n个不同字符的所有全排列:例如 123: ...3.不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组; void getarr(c

    设计一个递归算法求n个不同字符的所有全排列:例如

    123:

    123,132,213,231,312,321

    要点:

    1.n个元素的排列=(n-1)的排列+剩下元素作为前缀;

    2.如果只有一个元素的全排列,说明已经排列好,可以输出排列结果;

    3.不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组;

    而要得到(n-1)个数的全排列就必须得到(n-2)个数的全排列,,,最后得到一个数的全排列就是其本身,这也是递归的出口

    void getarr1(char str[],int k,int n){
    int i;
    char t;
    if(k==n-1){
     for(i=0;i<n;i++)
       printf("%c",str[i]);
    printf("\n");}//前n-1个数排列已经确定,递归到只有一个数
    else {
     for(i=k;i<n;i++)
     {t=str[k];
      str[k]=str[i];
     str[i]=t;
      getarr(str,k+1,n);
     t=str[i];
     str[i]=str[k];
     str[k]=t;}
        }
    }
    类似地,

    void getarr(char str[],int k,int n){
    int i;
    char t;
    if(k==0){
     for(i=0;i<n;i++)
       printf("%c",str[i]);
    printf("\n");}//只有一个元素的全排列
    else {
     for(i=0;i<=k;i++)
     {t=str[k];
      str[k]=str[i];
     str[i]=t;
      getarr(str,k-1,n);
     t=str[i];
     str[i]=str[k];
     str[k]=t;}
        }}


    展开全文
  • c语言实现全排列

    2021-05-21 00:42:39
    #include /************************************************************************//* 功能:实现两个整形参数值交换/* 参数:/* lhs--int类型的指针,指向待交换数1的地址/* rhs--int类型的指针,指向待交换数...

    #include

    /************************************************************************/

    /* 功能:实现两个整形参数值交换

    /* 参数:

    /*       lhs--int类型的指针,指向待交换数1的地址

    /*       rhs--int类型的指针,指向待交换数2的地址

    /************************************************************************/

    void Swap(int *lhs, int *rhs)

    {

    int t = *lhs;

    *lhs = *rhs;

    *rhs = t;

    }

    /************************************************************************/

    /* 功能:实现全排列功能

    /* 参数:

    /*       source--整数数组,存放需要全排列的元素

    /*       begin --查找一个排列的开始位置

    /*       end   --查找一个排列的结束位置,当begin=end时,表明完成一个排列

    /************************************************************************/

    void FullPermutation(int source[], int begin, int end)

    {

    int i;

    if (begin >= end) // 找到一个排列

    {

    for (i = 0; i < end; i++)

    {

    printf("%d", source[i]);

    }

    printf("\n");

    }

    else// 没有找完一个排列,则继续往下找下一个元素

    {

    for (i = begin; i < end; i++)

    {

    if (begin != i)

    {

    Swap(&source[begin], &source[i]); // 交换

    }

    // 递归排列剩余的从begin+1到end的元素

    FullPermutation(source, begin + 1, end);

    if (begin != i)

    {

    Swap(&source[begin], &source[i]); // 回溯时还原

    }

    }

    }

    }

    int main()

    {

    int source[30];

    int i, count;

    scanf("%d", &count);

    // 初始化数组

    for (i = 0; i < count; i++)

    {

    source[i] = i + 1;

    }

    FullPermutation(source, 0, count);

    return 0;

    }

    展开全文
  • C语言实现全排列算法

    万次阅读 多人点赞 2016-08-06 10:16:13
    程序的主要思路是: 1.把第1个数换到最前面来(本来就在最前面),准备打印1xx,...可见这是一个递归的过程,把对整个序列做全排列的问题归结为对它的子序列做全排列的问题,注意我没有描述Base Case怎么处理,你需要
  • 你的程序要具有通用性,如果改变了N和数组a的定义(比如改成4个数的数组),其它代码不需要修改就可以做4个数的全排列(共24种排列)。 解题过程: 1.当N = 1的时候,则直接打印数列即可。 2.当N
  • 话不多说,先上代码 #include<stdio.h> void fab(int n,int k); int index[50];...void fab(int n,int k) // n是全排列元素的总数 这里其实可以将其定义为全局变量 则不用每次递归都传入n {
  • 数组全排列c语言实现

    千次阅读 2011-12-26 13:06:39
    C 一站式编程网站,定义一个数组,编程打印它的全排列  程序的主要思路是: 1.把第1个数换到最前面来(本来就在最前面),准备打印1xx,再对后两个数2和3做全排列。 2.把第2个数换到最前面来,准备打印2...
  • #include #include void swap(char *left, char *right){char tmp = *left;*left = *right;*right = tmp;}void permutation(char *str, char *begin){char *swapPos = NULL;if(str == NULL || begin == NULL) return...
  • C语言通过递归实现全排列

    千次阅读 2020-04-04 17:45:17
    什么是全排列:假设有n个元素,我用这n个元素按一定顺序排列得到的序列,这个序列,就是这n个元素的一个全排列。 要解决的问题:求出n个元素的所有全排列 解决思路:对于第一个元素,先从n个元素中轮流选出一个当一...
  • C语言递归之 生成全排列_全局数组显示 这里以全局数组a来举例子,对其中的5个元素进行全排列并输出。 #include <stdio.h> #define N 5 int a[]={1,2,3,4,5}; int num = 0; void disp() { int i; ...
  • C语言递归实现全排列

    千次阅读 2016-12-06 20:57:56
    全排列:从m个数据中取出n个数据,输出其全部组合的可能性 例如:ABC中取出2个数据,输出其全部可能性 AB AC BA BC CA CB 我们将ABC进行编号,并且存放到一个名为used[]的数组中去,在开始时将其赋值为0表示...
  • 递归实现全排列c语言

    千次阅读 2020-12-20 11:29:15
    递归实现全排列c语言) 1、递归思想:前序遍历 2、n个字符为n叉树 代码: #include<stdio.h> #include<string.h> #define N 20//初始串的大小 void switch_a(char *a, int k, int j){//浅拷贝,传址 ...
  • 数组元素全排列(c/c++实现

    千次阅读 2019-01-13 16:37:59
    数组元素全排列(c/c++实现) 其实全排列的说白了就是,元素之间两两交换,交换后对其他元素进行全排,全排完其他元素,再把原先交换的那两个元素交换回来。不过这个过程要靠递归实现,需要对递归的知识有一定的把握...
  • 数组全排列问题

    2021-01-25 12:51:53
    将这个数组里面的元素进行全排列得到下面几组数据: 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 设R={r1,r2,r3,…,rn}是要进行排列的n个元素,Ri=R-{ri},集合X中元素的全排列记为perm(X)。(ri)perm(X)表示...
  • 定义一个数组,编程打印它的全排列。比如定义: #define N 3 int a[N] = { 1, 2, 3 }; 则运行结果是: $ ./a.out 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 3 1 2 1 2 3 程序的主要思路是: 把第1个数换到最前面来...
  • c语言实现对一个动态数组全排列,其中保存生成的全排列用了一个二维指针,求全排列用的递归的方法,代码在vc++6.0下调试通过,并附有详细注释。
  • 定义一个数组,编程打印它的全排列。比如定义:#define N 3int a[N] = { 1, 2, 3 };则运行结果是:$ ./a.out1 2 31 3 22 1 32 3 13 2 13 1 21 2 3程序的主要思路是:把第1个数换到最前面来(本来就在最前面),准备...
  • c语言中排序的实现方法有好几种.可以到百渡上去搜,会有不少答案的.给你提供几个.希望对你有帮助.这是冒泡法的程序:#includevoid sort(int array[],int size){int i,j,temp;/*下面是利用相邻的比较,把大的数放到...
  • 全排列算法(C语言)

    2021-09-30 09:18:04
    全排列C语言) 题意:给定1~n n个正整数,写出它们的所有排列顺序。 思路:根据高中的知识,我们知道不重复的条件下结果是n!个排列顺序。运用递归的思想。 背景 一开始我的想法是用一个数组去存放1-n个正整数,...
  • php求数组全排列,元素所有组合的方法总结发布于 2017-08-07 10:24:00 | 92 次阅读 | 评论: 0 | 来源: 网友投递PHP开源脚本语言PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本...
  • 本源程序经过测试正常运行,且修改数组时有提示修改相关地方即可正确使用,不必理解程序是如何实现(采用递归分治策略实现)的。
  • C++实现全排列

    千次阅读 2020-12-20 15:30:41
    给定一个数组,求这个数组全排列。 列如:a={1,2,3,4},对数组a求全排列 结题思路: 将a数组中的元素依次放在第一个位置然,对剩下的元素进行全排列。剩下元素全排列依然是,将剩下的元素依次放在第一个位置,对...
  • 递归模式(递归体)大问题如何分解为小问题二、递归实现字符串全排列1.二话不说先上代码:#include #include #include void swap(char *str,int i,int j){char c;c = str[i];str[i] = str[j];str[j] = c;}void ...
  • 递归交换法: #include <bits/stdc++.h> using namespace std; void print(int a[],int n) { for(int i=0;i<=n;i++) { cout<<a[i]<<' '; } cout<<endl; ... ...
  • /** 几种排列组合的算法*/#...//打印数组void showArray(int *a){int i;for(i=1;i<=n;i++)printf("%d",a[i]);printf("\n");}//翻转法void overturn(){int i,temp,temp1,temp2,j;int b[20];for(i=1;i<=n;i+...
  • C语言 —— 全排列(递归方法)

    千次阅读 2020-02-16 22:42:47
    如果排列为 abcde 且输出第一个为 a, 则fixed数组放了a, except数组放了bcde { fixed[0] = a[i]; //fixed数组放即将输出的首字母 fixed[1] = '\0'; except[0] = '\0'; //except数组存放...
  • C语言实现排列组合(全排列

    万次阅读 多人点赞 2020-02-07 17:13:05
    题目描述: 排列与组合是常用的数学方法。 先给一个正整数 ( 1 < = n < = 10 ) 例如n=3,所有组合,并且按字典...每个全排列一行,相邻两个数用空格隔开(最后一个数后面没有空格) 样例输入: 3 样例输出: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,226
精华内容 890
关键字:

c语言实现数组全排列