排列:
#include<iostream>
using namespace std;
void pailie(int*a , int pos,int size,int * r,bool* visited)
{
if(pos == 3)
{
for(int i=0;i<3;i++)
cout<<r[i]<<' ';
cout<<endl;
return;
}
for(int i=0;i<size;i++)
{
if(visited[i]==false)
{
r[pos] = a[i];
visited[i] = true;
pailie(a,pos+1,size,r,visited);
visited[i] = false;
}
}
}
int main()
{
int a[4] = {1,2,3,4};
int result[3] = {0};
bool visited[4] = {false};
pailie(a,0,4,result,visited);
}组合:
#include<iostream>
using namespace std;
void pailie(int*a , int pos,int size,int * r,bool* visited,int h)
{
if(pos == 3)
{
for(int i=0;i<3;i++)
cout<<r[i]<<' ';
cout<<endl;
return;
}
for(int i=h;i<size;i++)
{
if(visited[i]==false)
{
r[pos] = a[i];
visited[i] = true;
pailie(a,pos+1,size,r,visited,i+1);
visited[i] = false;
}
}
}
int main()
{
int a[4] = {1,2,3,4};
int result[3] = {0};
bool visited[4] = {false};
pailie(a,0,4,result,visited,0);
}
都通过回溯来做,组合的不同之处在于,每次选择了数组中的一个数字之后,记下标号,然后在选择下一个数字时,其位置应该在这个标号之后。
由此引申到hdoj1015的回溯方法,在hdoj1015中有一点要注意,就是char数组最后输出之前,要在末尾加上'\0'
或者在初始定义数组时候,全部清零。
比如:
char a[10] = {0}; -------------静态
或者
char* a = new char[size]; -----------------动态
memset(a,0,size);
总之应该多留一位
本文详细介绍了使用回溯法实现的排列与组合算法,并通过具体的C++代码示例进行了讲解。对比了两种算法的主要区别,强调了组合算法中对元素的选择顺序约束。此外,还提到了在使用字符数组进行输出时应注意的细节。
2294

被折叠的 条评论
为什么被折叠?



