关闭

全排列

154人阅读 评论(0) 收藏 举报
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int count = 0;
int perm(char*, int, int);
void Swap(char*, char*);
int judge(char*, int, int);
int main(void)
{
    char str[] = "aacc";
    printf("%d\n", perm(str, 0, strlen(str) - 1));
    return 0;
}
//perm[k, n]的全排列
int perm(char *array, int k, int n)
{
    int i;
    if (k == n)
    {
        ++count;
        printf("%s\n", array);
    }
    else
    {
        for (i = k; i <= n; ++i)
        {
            //如果从k -> (i - 1)有与i相同的就不需要换了
            if (judge(array, i, k))
            {
                Swap(&array[i], &array[k]);
                perm(array, k + 1, n);
                Swap(&array[i], &array[k]);
            }
        }
    }
    return count;
}
//交换两个字符型数据
void Swap(char *a, char *b)
{
    char temp = *a;
    *a = *b;
    *b = temp;
}
//判断从[k, (i - 1)]的元素中有没有与第i个相同的元素
int judge(char *array, int i, int k)
{
    int t;
    if (i > k)
    {
        for (t = k; t < i ; ++t)
        {
            if (array[t] == array[i])
            {
                return 0;
            }
        }
    }
    return 1;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:132108次
    • 积分:3905
    • 等级:
    • 排名:第8373名
    • 原创:293篇
    • 转载:22篇
    • 译文:0篇
    • 评论:11条
    文章分类
    最新评论