全排列:(提示)
#include"stdafx.h" //这个头文件是在visual studio 2010 环境下运行时用到的 注释掉#include<stdio.h>即可
#include<stdio.h> //这个头文件是在dev-c++ 5.11 环境下运行时用到的 注释掉#include"stdafx.h"即可
#include"stdafx.h"
//#include<stdio.h>
int n = 0;
void swap(int *a, int *b)
{
int m;
m = *a;
*a = *b;
*b = m;
}
void perm(int list[],int k, int m)
{
int i;
if (k >m)
{
for (i= 0; i <= m; i++)
printf("%d", list[i]);
printf("\n");
n++;
}
else
{
for (i= k; i <= m; i++)
{
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}
int main()
{
int list[]=
{
1, 2, 3
};
perm(list, 0, 2);
printf("total:%d\n",n);
return 0;
}
第二种方法
//#include"stdafx.h"
#include <stdio.h>
int main() {
intn, num, i, k, r, a[254], d[254], e[254], p, q;
printf("PleaseEnter N:");
scanf("%d",&n);
a[1]= 1;
for(i = 1; i <= n; i++) {
a[i]= i;
d[i]= i;
e[i]= - 1;
}
q= 0;
if(q == 0) {
for(i = 1; i <= n; i++)
printf("%d", a[i]);
/*输出原始排列结果 */
printf("\n");
}
k= n;
num= 1;
while(k > 1) {
d[k]= d[k] + e[k];
p= d[k];
if(p == k) {
e[k]= - 1;
k= k - 1;
}else if (p == 0) {
e[k]= 1;
q= q + 1;
k= k - 1;
}else {
p= q + p;
r= a[p];
a[p]= a[p + 1];
a[p+ 1] = r;
q= 0;
for(i = 1; i <= n; i++)
/*换位并输出 */
printf("%d", a[i]);
printf("\n");
k= n;
num= num + 1;
}
}
printf("\nTotalNum:%d", num);
return(0);
}
ref:⒈王晓玲. 换位法实现全排列[J]. 沧州师范学院学报, 2004, 20(4):56-56.