用了一个 笨方法,即全排列,每次当该元素的前趋记录里面没有当前前趋时,就可输出。抛砖引玉吧,盼望好的程序出现:
程序代码:
程序代码:
#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("");
}









不懂
