求n个数的全排列问题

zhouqi66 aaaaaaaaa CEO/董事长/总经理  2004-11-30 09:34:53
输入:n和n个数,输出:n个数的全排列.
...全文
145 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
rickone 2004-11-30
a[]中存放待排列的元素,v[]中标记某个元素已被提取(初值全为0),s[]中为一种排列。
排列的过程是这样的:
1、这个过程确定第c个位置上的元素
2、i=1
3、i是否大于n,是就输出s[]中一种排列
4、v[i]是否为1,即a[i]是否已被提取,是就++i,否则s[c]=a[i];v[i]=1;递归调用整个过程(c+1)
5、v[i]=0;++i ===>3

void dfs(c);
int c;
{
int i;
if(c>n)
for(i=1;i<=n;++i)输出s[i];
else
for(i=1;i<=n;++i)
if(!v[i]){
s[c]=a[i];
v[i]=1;
dfs(c+1);
v[i]=0;
}//if
}//dfs
回复
jp1984 2004-11-30
/*
backtrack never dies
To flower tea with all my best love
*/
#include <stdio.h>
#include <stdlib.h>
void swap(int* p,int* q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}

void permute(int arr[],int n,int i)
{
int j,k ;
/* backtracking */

if(i == n - 1)
{
for(k = 0;k < n;k++)
printf("%d",arr[k]);
putchar('\n');
}
else
{
for(j = i;j < n;j++)
{
swap(&arr[i],&arr[j]);
permute(arr,n,i + 1);
swap(&arr[i],&arr[j]);/* backtrack */
}
}
}
回复
pcboyxhy 2004-11-30
#include<iostream.h>

const int maxlen=9;

int num[9]={1,2,3,4,5,6,7,8,9};

void pailie()
{
int fenjie,i,j,k=maxlen-1,t;
bool bb=true;
while(bb)
{
i=0;
while(i<=k)
cout<<num[i++]<<endl;
fenjie=k;
while(fenjie>0&&num[fenjie-1]>num[fenjie]) fenjie--;
if(fenjie)
{
j=k;
while(num[j]<num[fenjie-1]) j--;
i=num[j]; num[j]=num[fenjie-1]; num[fenjie-1]=i;
i=fenjie+k;
for(j=fenjie;j<=i/2;j++){t=num[j]; num[j]=num[i-j]; num[i-j]=t; }
}
else
bb=false;
}
}

int main( void)
{
pailie();
}

非递规的算法如上
回复
相关推荐
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2004-11-30 09:34
社区公告
暂无公告