#include <stdio.h>
#define N 10
swap(int *p,int *q)
{
int temp
temp=*p
*p=*q
*q=temp
}
sort(int a[],int k,int n)
{ int temp1,temp2,j,i
if(k==n)
{
for( i=0i<=ni++)
printf("%d",a[i])
printf("\n")
}
else{
for(j=kj<=nj++)
{
swap(&a[k],&a[j])
sort(a,k+1,n)
swap(&a[k],&a[j])
}
}
}
main()
{
int a[N]
int n,i
scanf("%d",&n)
for(i=0i<ni++)
scanf("%d",&a[i])
sort(a,0,n-1)
}
基本思想是用回溯法来搜索每一种排列不过楼主对问题的说明不是很详细,所以我只好写个普适性比较大的了
下面这个程序读取一行字符串,然后对该字符串中的所有字符进行全排列输模厅出
注:输入的字符串不要太好族长,因为不存在能够在短时间内输出全排列的算法
#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)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)