[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;
}