还是大学时学了递归和回溯算法时,写的一个数字排列的小程序。
给定一个数字N,则有2N个数字,每个数字都出现2次,要求将这些数字排列成一个长串,两个1之间隔1个数,两个2之间隔2个数,……
例如当N等于3时,则数字集合就是:1,1,2,2,3,3
一个正确的排列就是3,1,2,1,3,2
#define MAX2N 40*2
#include <stdio.h>
int a[MAX2N];
int n, count;
FILE *fp;
void trial(int);
void out();
main()
{
int i, n0, n1;
printf("please input n0, n1\n");
scanf("%d,%d", &n0, &n1);
fp=fopen("s123.dat", "w");
for(n=n0; n<=n1; n++) {
count=0;
for(i=0; i<n*2; i++) a[i]=0;
trial(1);
}
}
void trial(int i)
{
int j;
if(i>n) out();
else
for(j=0; j<2*n-i-1; j++) {
if(a[j] || a[j+i+1]) continue;
if(i==1 && j>=n) break;
a[j]=a[j+i+1]=i;
trial(i+1);
a[j]=a[j+i+1]=0;
}
}
void out()
{
int i;
fprintf(fp, "%d(%d): ", n, ++count);
for(i=0; i<2*n; i++)
fprintf(fp, "%d,", a[i]);
fprintf(fp,"\n");
}