排列:
#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);
总之应该多留一位