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;
}
函数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;
}
相关文章推荐
- nyoj19(排列组合next_permutation(s.begin(),s.end()))
- NYOJ366 D的小L 和 NYOJO32 组合数 和 NYOJ19 擅长排列的小明 和 NYOJ488 素数环 【递归】
- NYOJ 题目19 擅长排列的小明(dfs)
- NYOJ 19 擅长排列的小明 DFS
- nyoj 19 擅长排列的小明
- nyoj19(擅长排列的小明)
- NYOJ 19-擅长排列的小明
- nyoj19 擅长排列的小明
- NYOJ 题目19 擅长排列的小明(dfs)
- nyoj 19擅长排列的小明 (DFS)
- NYOJ 19 擅长排列的小明(dfs递归)
- NYOJ 19-擅长排列的小明
- NYOJ 19 擅长排列的小明
- NYOJ 19 擅长排列的小明(全排列<next_permutation>)
- nyoj19擅长排列的小明(递归)
- NYOJ 19(擅长排列的小明)
- nyoj 32 组合数 【全排列(逆序)】
- NYOJ--19--擅长排列的小明
- nyoj-19-擅长排列的小明
- nyoj19 全排列