唉,这个问题我想了一天半,一直没想通,哈啊哈哈哈。
今天动手画了画图,把程序走了一遍,才搞出来,但对于递归还是不太理解,这个算法,最好画一遍图,自己走一遍。要不然真的容易绕进去。本人是一个菜鸡,之前参加学校的ACM纳新赛惨遭淘汰,现在自学算法,唉,给自己加加油,说不定我就是下一个大佬呢,人可以不强大,但一定要有梦想,梦想看起来很扯淡,不扯淡那还叫梦想???(手动滑稽~)
全排列指的是n个整数的所有排列,按从小到大的顺序输出n个整数的全排列,其中(a1,a2,…ana1,a2,…an)的顺序小于(b1,b2…bnb1,b2…bn):a1=b1,a2=b2…an=bn,ai<bia1=b1,a2=b2…an=bn,ai<bi
举个例子:(1 - 3)的从小到大的顺序全排列:
(1,2,3),(1,3,2),(2,1,3),(2,3,1)(3,1,2),(3,2,1)
从分治的角度考虑,可以划分为多个子问题,"1开头的全排列","2开头的全排列"... P[ ] 存放当前排列
hashtable[x]:当x在当前的排列P中时,hashtable[x] = true;
#include<iostream>
using namespace std;
const int Max=11;
int n,HashTable[Max]={false},P[Max];
void generateA(int index)
{
if(index==n+1)
{
for(int i=1;i<=n;i++)
cout<<P[i];
cout<<endl;
return;//此时程序终止,函数不再往下执行
}
for(int i=1;i<=n;i++)
{
if(HashTable[i]==false)
{
cout<<"hash"<<i<<endl;
P[index]=i;
HashTable[i]=true;
generateA(index+1);
HashTable[i]=false;
}
}
}
int main()
{
n=3;
generateA(1);
return 0;
}
唉,凑合着看吧,能看懂就行,毕竟我查了一遍,CSDN上目前还没得人这么搞这个算法的图解(手动滑稽~)
快期末了,可能最近会更新的少一些,不说了,学习!