回溯算法实现全排列2

问题仍然是昨天的问题,今天又花了一个小时左右自己重写了一遍:

include<bits/stdc++.h>

void swapa(int &a,int & b)
{
int temp=a;
a=b;
b=temp;
}

void qp(int start,int a[],int n)
{
if(start==n-1)
{
for(int i=0;i<n;i++)
{
cout<<a[i];
if(i<n)
{
cout<<",";
}
}
cout<<endl;
}
for(int i=start;i<n;i++)
{
swapa(a[i],a[start]);
qp(start+1,a,n);
swapa(a[i],a[start]);
}
}

int main()
{
int a[3]={1,2,3};
int start=0;
int n=sizeof(a)/sizeof(a[0]);
qp(0,a,n);
system("pause");
return 0;
}

这串代码实现全排列的方式很巧妙,近下来详细说明思路:
理论上实现全排列的方法有很多,比方说最简单的罗列,从1做第一个数字开始,2坐第二个数字,3做第三个数字,依此类推,然后前面的数字不变,倒数第二个数字换成最后一个数字,然后是倒数第三个,依此类推即可。
这道题采用的全排列方式是:将第一个数字与下一个数字交换位置,然后是与后面的第二个,后面的第三个等等,接着,在第一次交换的基础上将后面的数字进行类似的交换,用图讲述就是下面的这张图,这个思路十分巧妙,完美适配回溯算法,可算搞明白了,拿下!!

posted @ 2025-07-30 21:28  暗神酱  阅读(5)  评论(0)    收藏  举报