acm题 用c语言设计一个递归算法求全排列

Python015

acm题 用c语言设计一个递归算法求全排列,第1张

//1.cpp生成1~n的全排列

#include<stdio.h>

void Arrange(int cur,int n,int* arr)

{

    if(cur==n+1)

    {

        for(int i=1i<curi++)

            printf("%d ",arr[i])

        printf("\n")

        return 

    }

    for(int i=1i<=ni++)

    {

        int ok=1

        for(int j=1j<curj++)

            if(arr[j]==i)

                ok=0

        if(ok)

        {

            arr[cur]=i

            Arrange(cur+1,n,arr)

        }

    }

}

int main()

{

    int arr[15]

    //生成1~n的排列

    int n

    printf("Input n:")

    scanf("%d",&n)

    Arrange(1,n,arr)

    return 0

}

//2.cpp生成集合中元素的全排列

#include<stdio.h>

int Set[15]

int Arr[15]

int n

void Arrange(int cur)

{

    if(cur==n+1)

    {

        for(int i=1i<curi++)

            printf("%d ",Arr[i])

        printf("\n")

        return 

    }

    for(int i=1i<=ni++)

    {

        int ok=1

        for(int j=1j<curj++)

            if(Arr[j]==Set[i])

                ok=0

        if(ok)

        {

            Arr[cur]=Set[i]

            Arrange(cur+1)

        }

    }

}

int main()

{

    printf("Input number of elem:")

    scanf("%d",&n)//元素个数

    printf("Input elems:")

    for(int i=1i<=ni++)//元素

        scanf("%d",&Set[i])

    Arrange(1)

    return 0

}

基本思想是用回溯法来搜索每一种排列

不过楼主对问题的说明不是很详细,所以我只好写个普适性比较大的了

下面这个程序读取一行字符串,然后对该字符串中的所有字符进行全排列输出

注:输入的字符串不要太长,因为不存在能够在短时间内输出全排列的算法

#include <stdio.h>

#include <string.h>

#include <memory.h>

int m//记录字符串长度

int n//记录字符串中的字符种类数

char map[256]//记录是哪几种字符

int count[256]//记录每种字符有多少个

void Make_Map(char *str)//统计字符串的相关信息

{

int s[256]

int i

memset(s,0,sizeof(s))

memset(count,0,sizeof(count))

m=strlen(str)

while(*str)

{

s[*str]++

str++

}

n=0

for (i=0i<256i++)

if (s[i])

{

map[n]=i

count[n]=s[i]

n++

}

}

int stack[1000]//递归用的栈,并记录当前生成的排列

void Find(int depth)//递归式回溯法生成全排列

{

if (depth==m)

{

int i

for (i=0i<depthi++) putchar(map[stack[i]])

putchar('\n')

}

else

{

int i

for (i=0i<ni++)

if (count[i])

{

stack[depth]=i

count[i]--

Find(depth+1)

count[i]++

}

}

}

main()

{

char str[1000]

gets(str)

Make_Map(str)

Find(0)

}