[bo][un]广陵绝唱[/un] 在 2008-11-5 10:29 的发言:[/bo]
说实话,全排列的程序现在还没弄懂,网上看了不少,去某些Q群和论坛也去问过,可是到现在也没弄出个子午卯酉。如果你能详细讲解一下,感激不尽。
说实话,全排列的程序现在还没弄懂,网上看了不少,去某些Q群和论坛也去问过,可是到现在也没弄出个子午卯酉。如果你能详细讲解一下,感激不尽。
你先尝试一下嘛,不行的话,我再帖我的代码,m分成n组那个我还没搞定,因为貌似比较复杂……我用的动态二叉树的回溯做的……
/*********************************************************************** 依样画葫芦,写了这个程序,不过还只是知其然而不知其所以然,对于它的 原理,为什么会完成这样的功能,还是不明白。另外,这个程序显然有些弊病, 因为是两个数为一组,那么对于2、3和3、2这样的一组,它就不能区分。 由于对程序的原理弄不明白,所以也不知道这样的弊病怎样去修改。希望哪 位朋友帮忙解释一下,不胜感激。 ***********************************************************************/ #include<stdio.h> #include<string.h> #define N 11 int j=0; void formturn(int index,char *s,char *mys) { char s1[N]; char tmp; int i; for(i=0;i<strlen(s);i++) { tmp=s[i]; mys[index]=s[i]; s[i]=0; strcpy(s1,s); strcat(s1,&s[i+1]); s[i]=tmp; formturn(index+1,s1,mys); } if(strlen(s)==0) { mys[N-1]='\0'; printf("%c%c,%c%c,%c%c,%c%c,%c%c\n",mys[0],mys[1],mys[2],mys[3],mys[4], mys[5],mys[6],mys[7],mys[8],mys[9]); } } void main() { char s[N]={'1','2','3','4','5','6','7','8','9','10'}; char mys[N]; strcpy(mys,s); formturn(0,s,mys); return 0; }
#include <stdio.h> #include <stdlib.h> #define SWAP(a, b) {int t__=a; a=b; b=t__; } int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, len = 10, count = 0; void select(int k) { int i; if (k + 2 == len) { for (i = 0; i < len; i += 2) printf("(%d, %d)", a[i], a[i+1]); printf("\n"); count++; return; } select(k + 2); for (i = k + 2; i < len; i++) { SWAP(a[k + 1], a[i]); select(k + 2); SWAP(a[k + 1], a[i]); } } int main(void) { select(0); printf("count:%d\n", count); return 0; }
#include <stdio.h> #include <string.h> #define N 10 int time = 0; void formturn(int index, char *s, char *mys) { int i; for (i = 0; i < N - index; i++) { char s1[N + 1]; mys[index] = s[i]; strncpy(s1, s, i); strcpy(s1 + i, s + i + 1); formturn(index + 1, s1, mys); } if (index == N) time++; } int main(int argc, char *argv[]) { int i; char s[N + 1], mys[N + 1]; for (i = 0; i < N; i++) s[i] = '0' + i; formturn(0, s, mys); printf("%d\n", time); return 0; }
#include <stdio.h> #include <string.h> #define N 10 int time = 0; void formturn(int index, char *s, char *ans) { int i; for (i = 0; i < N - index; i++) { int slen = N - index - i + 1; ans[index] = s[i]; memmove(s + i, s + i + 1, slen); formturn(index + 1, s, ans); memmove(s + i + 1, s + i, slen); s[i] = ans[index]; } if (index == N) { /* for (i = 0; i< N; i++) printf("%c", ans[i]); printf("\n"); // */ time++; } } int main(int argc, char *argv[]) { int i; char s[N + 1], ans[N + 1]; for (i = 0; i < N; i++) s[i] = '0' + i; formturn(0, s, ans); printf("%d\n", time); return 0; }