perm(list,i,j)是一个全排列函数,拿你上面的列子来说:
十余年的章丘网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。全网整合营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整章丘建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联建站从事“章丘网站设计”,“章丘网站推广”以来,每个客户项目都认真落实执行。
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循环的意思
这只是形象的比喻一下
#include iostream
#include stdio.h
#include algorithm
using namespace std;
int main()
{
int num[4]={1,2,3,4};
do
{
printf("%c,%c,%c,%c\n",num[0]+'A'-1,num[1]+'A'-1,num[2]+'A'-1,num[3]+'A'-1);
}while(next_permutation(num,num+4));
return 0;
}
可以借助于stl模板中的next_permutation函数,这个函数是按照字典序不停的取该序列的下一个序列,直到结束。然后输出的时候讲数字转化为你要的字母即可。
例如 第一个序列是1,2,3,4,--》A,B,C,D
给,已经编译运行确认:
#includestdio.h
#includestring.h
char a[20];
int lenth;
long count=0;
void main()
{void move(int,int);
int i,j=0;
printf("input:");gets(a);
lenth=strlen(a);
for(i=0;ilenth;i++)
move(j,i);//move a[i] to the front of a[j];
printf("\ntotal=%d\n",count);
}
void move(int here,int which)//move a[which] to the front of a[here];
{char b[20];
char temp;
int m,n;
if(herelenth-1)
{if(here!=which)
{for(m=0;mlenth;m++)
b[m]=a[m];
temp=a[which];
for(m=which;mhere;m--)
a[m]=a[m-1];
a[m]=temp;
}
for(n=here+1;nlenth;n++)
move(here+1,n);
if(here!=which)
for(m=0;mlenth;m++)
a[m]=b[m];
}
else
{printf("%-10s",a);
count++;}
}
void chang(char str[],int m) /*定义循环左移函数(我没有用左移函数)*/
{
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();
}
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;
}
可以输出所有的排列,i和n表示排列的起始点和终止点比如说要排列"abcd"起点就是0,终点是3,perm(“abcd”,0,3)就可以了。