您的位置:首页 > 其它

nyoj19 排列及组合

2012-10-16 22:26 337 查看
具体参考:百科百科 全排列 算法竞赛与入门经典

函数Perm(int list[],int k,int m)是求将list的第0~k-1个元素作为前缀、第k~m个元素进行全排列得到的全排列,如果k为0,且m为n,就可以求得一个数组中所有元素的全排列。其想法是将第k个元素与后面的每个元素进行交换,求出其全排列。这种算法比较节省空间。

Code one

#include<iostream>

using namespace std;

void swap(int *a,int *b)

{

int m;

m=*a;

*a=*b;

*b=m;

}

void perm(int list[],int k,int m)

{

int i;

if(k>m)

{

for(i=0;i<=m;++i)

cout<<list[i];

cout<<endl;

}

else

{

for(i=k;i<=m;++i)

{

swap(&list[k],&list[i]); //交换元素的位置

perm(list,k+1,m);

swap(&list[k],&list[i]); //回溯

}

}

}

int main()

{

int list[]={1,2,3,4,5};

perm(list,0,4);

system("pause");

return 0;

}

Code 2

#include<iostream>

using namespace std;

void perm(int,int *,int );

int A[100],cur;

int main()

{

perm(4,A,0);

system("pause");

return 0;

}

void perm(int n,int A[],int cur)

{

int i,j;

if(cur==n)

{

for(j=0;j<cur;++j)

cout<<A[j];

cout<<endl;

}

for(i=1;i<=n;++i)

{

int ok=1;

for(j=0;j<cur;++j)

if(A[j]==i) ok=0;

if(ok)

{

A[cur]=i;

perm(n,A,cur+1);

}

}

}

排列组合

例子,NYOJ 19

AC Code

#include<iostream>

using namespace std;

bool visited[100];

int a[100];

void f(int i,int m,int n)

{

int j,k;

if(i>m)

{

for(k=1;k<=m;++k)

cout<<a[k];

cout<<endl;

}

else

{

for(j=1;j<=n;++j)

{

if(visited[j]==0)

{

visited[j]=1;

a[i]=j;

f(i+1,m,n);

visited[j]=0; //回溯

}

}

}

}

int main()

{

int test,n,m;

cin>>test;

while(test--)

{

cin>>n>>m;

f(1,m,n);

}

system("pause");

return 0;

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