重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
void chang(char str[],int m) /*定义循环左移函数(我没有用左移函数)*/
成都创新互联长期为成百上千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为黄冈企业提供专业的成都做网站、成都网站建设,黄冈网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。
{
int i,j;
char temp=str[0];
for (i=0;im;i++) str[i]=str[i+1];
str[i]=temp;
}
void pai(char str[],int m,int n) /*定义全排列函数*/
{
int k;
void chang(char str[],int m);
if (mn) /* 定 义 递 归 调 用 出 口 */
{
for (k=0;k=m;k++)
{
pai(str,m+1,n); /*递归调用*/
chang(str,m); /*调用左移函数*/
}
}
else printf("%s\t",str);
}
#include "stdio.h"
main()
{char str[]="ABCD"; /*全排列字符,可以任意多个(相应的下面排列函数中参数"4"改成全排列字符的个数)*/
clrscr();
pai(str,0,4); /*这里参数0(下标)表示从第一个元素开始,4表示元素个数(不是下标)*/
getch();
}
可以输出所有的排列,i和n表示排列的起始点和终止点比如说要排列"abcd"起点就是0,终点是3,perm(“abcd”,0,3)就可以了。
C语言中没有吧?C++中倒是有一个:
next_permutation(array,array+arrlength)
使用的头文件是#include algorithm
示例:
#include iostream
#include algorithm /// next_permutation, sort
using namespace std;
int main () {
int myints[] = {1,2,3,1};
sort (myints,myints+4);
do {
cout myints[0] ' ' myints[1] ' ' myints[2] ' ' myints[3]'\n';
} while ( next_permutation(myints,myints+4) ); ///获取下一个较大字典序排列
cout "After loop: " myints[0] ' ' myints[1] ' ' myints[2] ' ' myints[3] '\n';
return 0;
}
perm(list,i,j)是一个全排列函数,拿你上面的列子来说:
perm(list,0,5)意思是数组list的前6个数(第0个数到第5个数)的所有排列,它细分的话就等于:第0个数和第1个数互换以后的perm(list,1,5) 第0数和第2数互换perm(list,1,5) ....第0数和第5数互换的perm(list,1,5) 和它本身的所在0位置的perm(list, 1, 5)
如假如6个数是1 2 3 4 5 6
他们的排列就 * * * * * * perm(list,0,5)
1 * * * * * perm(list,1,5)
2 * * * * * perm(list,1,5)
3 * * * * * perm(list,1,5)
4 * * * * * perm(list,1,5)
5 * * * * * perm(list,1,5)
6 * * * * * perm(list,1,5) 就是每一个数都在第0个位置上面都出现一次以后的排列总和。 也就是它的for循环的意思
这只是形象的比喻一下