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语言全排列的主要内容,如果未能解决你的问题,请参考以下文章
求n个数的全排列,n不定。用c语言。用于银行家算法中求安全序列