您的位置:首页 > 其它

全排列问题

2016-05-07 00:10 246 查看
方法一:能列出但是不是很完美,代码如下:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int a[100];

void swap(int *p,int *q)
{
int t;
t = *p;
*p = *q;
*q = t;
}

void prim(int a[],int k,int m)
{
int i, j;
if( k==m )
{
for( i = 1; i <= m; i++ )
{
printf(i==1?"%d":" %d",a[i]);
}
printf("\n");
}
else
for( j = k; j <= m; j++ )
{
swap(&a[k],&a[j]);
prim( a,k+1,m );
swap(&a[k],&a[j]);
}
}

int main()
{
int i, n;
while( ~scanf("%d",&n) )
{
for( i = 1; i <= n; i++ )
{
scanf("%d",&a[i]);
}
prim(a,1,n);
printf("\n");
}
return 0;
}
方法二:方法一的优化版,相当于线段上的搜索

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

int cnt;
int flag[100];
int a[100];
int b[100];
int n;

void dfs(int a[],int cnt)
{
int i;
if( cnt==n+1 )
{
for( i = 1;i <= n;i++ )
{
printf(i==1?"%d":" %d",b[i]);
}
printf("\n");
return ;
}
for( i = 1;i <= n;i++ )
{
if( flag[i]==0 )
{
flag[i] = 1;
b[cnt] = a[i];
dfs(a,cnt+1);
flag[i] = 0;
}
}
}

int main()
{
int i;
while( ~scanf("%d",&n) )
{
cnt = 0;
memset(flag,0,sizeof(flag));
for( i = 1;i <= n;i++ )
{
scanf("%d",&a[i]);
}
dfs(a,1);
printf("\n");
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: