c语言全排列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言全排列相关的知识,希望对你有一定的参考价值。

怎么编写C语言的全排列啊?急!
最好有详细注释的

基本思想是用回溯法来搜索每一种排列
不过楼主对问题的说明不是很详细,所以我只好写个普适性比较大的了
下面这个程序读取一行字符串,然后对该字符串中的所有字符进行全排列输出
注:输入的字符串不要太长,因为不存在能够在短时间内输出全排列的算法
#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=0;i<256;i++)
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=0;i<depth;i++) putchar(map[stack[i]]);
putchar('\n');

else

int i;
for (i=0;i<n;i++)
if (count[i])

stack[depth]=i;
count[i]--;
Find(depth+1);
count[i]++;




main()

char str[1000];
gets(str);
Make_Map(str);
Find(0);
参考技术A 基本思想是用回溯法来搜索每一种排列
不过楼主对问题的说明不是很详细,所以我只好写个
普适性
比较大的了
下面这个
程序
读取一行
字符串
,然后对该字符串中的所有
字符
进行全排列输出
注:输入的字符串不要太长,因为不存在能够在短时间内输出全排列的
算法
#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=0;i<256;i++)
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=0;i<depth;i++)
putchar(map[stack[i]]);
putchar('\n');

else

int
i;
for
(i=0;i<n;i++)
if
(count[i])

stack[depth]=i;
count[i]--;
Find(depth+1);
count[i]++;



main()

char
str[1000];
gets(str);
Make_Map(str);
Find(0);

C语言-数字的全排列

输入一个数字序列a1,a2,...,an,将该序列进行排列,并输出每一种排列方式。例如:1,3,5.该数列就有6种排列方式。利用递归不难实现

#define max 100

void Perm(int a[], int n, int s, int r[], int m) 
    int i, j, k, flag = 0;
    int b[max];
    for (i = 0; i < n; ++i) 
        flag = 1;
        r[s] = a[i];
        j    = 0;
        for (k = 0; k < n; k++)
            if (i != k) 
                b[j] = a[k];
                j++;
            
        
        Perm(b, n - 1, s + 1, r, m);
    
    if (flag == 0) 
        printf("\\n");
        for (k = 0; k < m; k++)
            printf("%d", r[k]);
        printf("\\n");
    

int main(int argc, const char *argv[]) 
    int a[max], r[max];
    int i, n;
    printf("Please input the number of digit in the array\\n");
    scanf("%d", &n);
    printf("Please input a string for array\\n");
    for (i = 0; i < n; i++)
        scanf("%d", &a[i]);
    Perm(a, n, 0, r, n);
    return 0;

结果:

以上是关于c语言全排列的主要内容,如果未能解决你的问题,请参考以下文章

C语言数字全排列的问题(急!!)求C代码和算法

求n个数的全排列,n不定。用c语言。用于银行家算法中求安全序列

C语言-数字的全排列

C语言全排列问题为啥用指针比数组慢很多?

c语言中,如何输出一个数组的全排列!如a[3]=1,2,3 要求输出1 2 3,1 3 2,

四种语言刷算法之47. 全排列 II