首页 > 其他 > 详细

【排列组合】

时间:2017-02-01 18:05:13      阅读:262      评论:0      收藏:0      [点我收藏+]

/*
排列组合

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

解法:
可以使用递回将问题切割为较小的单元进行排列组合,例如1234的排列可以分为1[234] 、2[134] 、3[124] 、4[123]进行排列,这
边利用旋转法,先将旋转间隔设为0,将最右边的数字旋转至最左边,并逐步增加旋转的间隔,
例如:
1234->旋转1->继续将右边234进行递回处理
2134->旋转12为 变为 21->继续将右边134进行递回处理
3124->旋转123为 变为 312->继续将右边124进行递回处理
4123->旋转1234变为4123->继续将右边123进行递回处理
*/

#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("\n");
    }
}

 

【排列组合】

原文:http://www.cnblogs.com/libra-yong/p/6360157.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!