#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)
}