字母或数字全排列问题
全排列:(提示)
#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.
不为失败找原因,要为成功找方法!