方案的主要想法如下:
1 .把第一个个数换到开头(原本在开头),准备打印1xx,把后面的两个个数2和3完全排列好。
2 .将第二个个数改为开头,准备打印2xx,将以下两个个数1和3完全排列。
3 .将第三个个数改为开头,准备打印3xx,将以下两个个数1和2完全排列。
可以看到,这是一个递归过程,它将整个数组作为所有数组的问题归结为子数组作为所有数组的问题。 因为没有说明Base Case是如何处理的,所以需要自己思考。 要使的程序具有通用性,可以更改n和数组a的定义(例如,更改为4个数组),其他代码可以创建4个所有数组(共24种数组),而无需修改。
解决问题的过程:
N=1时,直接打印数列即可。
N=2时,将排列设为[a、b]
打印a[0],a[1] (即a,b )
交换a[0],a[1]的内容
打印a[0],a[1] (此时为[b,a] ) ) ) ) ) ) )。
当N=3时,排列为[a、b、c]
将3.1置于a[0]的位置,打印(原本如此,a[0]=a[0] )、b、c的全部排列)即a[1]、a[2]的全部排列)
3.2a[0]位置放置b (在这种情况下,必须更换原始数组中的a[0]和a[1] ),打印所有数组a、c,打印完成后返回原始位置。 即,a返回a[0],b返回a[1]的位置
将3.3置于a[0]位置,此时需要更换的是原序列的a[0]和a[2]。 之后,打印a、b的全部排列,打印结束后返回原来的位置。 即,a返回a[0],b返回a[1]的位置
至此,所有数组都完成了
当n=4,5,6,…时,类推。
#包含
/* * * * * * * * * * * * * * * * * *
/*功能:实现两个整形参数的值交换
/*参数:
/* lhs--int型指针。 指向要更换的编号1的地址
/* rhs--int型指针。 指向要交换的数2的地址
/* * * * * * * * * * * * * * * * * *
语音扫描(int *rhs,int *rhs ) )。
{
int t=*lhs;
*lhs=*rhs
*rhs=t;
}
/* * * * * * * * * * * * * * * * * *
/*功能:实现全排列功能
/*参数:
/* source--整数数组,包含需要所有数组的元素
/* begin --查找数组的开始位置
/* end --查找数组的结束位置,如果begin=end,则表示数组已完成
/* * * * * * * * * * * * * * * * * *
语音聚合(int source [ ],int begin,int end ) )。
{
int i;
找到if(begin=end )//数组
{
for(I=0; I结束; I )
{
printf('%d ',source[i] );
}
printf((n );
}
如果找不到else//数组,则继续查找下一个元素
{
for(I=Begin; I结束; I )
{
if(Begin!=i )
{
swap(source[Begin],source[i]; //交换
}
//递归排列剩下的begin 1到end的元素
完全性能(source,begin 1,end );
if(Begin!=i )
{
swap(source[Begin],source[i]; //上溯时恢复原状
}
}
}
}
int main () )
{
int source[30];
int i,计数;
canf('%d ',count );
//初始化数组
for(I=0; I计数; I )
{
source[i]=i 1;
}
完全性能(源,0,计数);
返回0;
}
希望以上是正文的全部内容,对大家的学习有帮助。 另外,我希望你支持很多编剧。