用了一个 笨方法,即全排列,每次当该元素的前趋记录里面没有当前前趋时,就可输出。抛砖引玉吧,盼望好的程序出现:
程序代码:
#include<stdio.h> #define N 8 #define WAP(a,b) {tmp=a;a=b;b=tmp;} struct str { int a; int b[N]; }str[N],tmp; void my_sort(int); void print(); int check( ); int num; int main(void) { int a[N]; int i,j; for (i = 0; i < N; ++i) { str[i].a = i + 1; } my_sort(0); printf("num=%d\n",num); return 0; } void my_sort( int k) { int i; if (k + 1 == N&&check()) { print(); ++num; } else { for (i = k ; i < N; ++i) { WAP(str[i], str[k]); my_sort(k + 1); WAP(str[i], str[k]); } } } int check() { int i,j; for(i=1;i<N;++i) { for(j=0;j<N;++j) { if(str[i-1].a==str[i].b[j]) // 检查前趋记录里是否有当前前趋 { return 0; } } } return 1; } void print() { int i; int j; for (i = 0; i < N; ++i) { printf("%2d", str[i].a); if(i) { for(j=0;j<N;++j) { if(str[i].b[j]==0) { str[i].b[j]=str[i-1].a; // 记录前趋 break; } } } } puts(""); }