【排列组合】

 

/*
排列组合

说明:
将一组数字、字母或符号进行排列,以得到不同的组合顺序,例如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");
    }
}

 

运行结果:

 

posted @ 2017-02-01 17:32  天秤libra  阅读(858)  评论(0编辑  收藏