一个数字排列的小程序

还是大学时学了递归和回溯算法时,写的一个数字排列的小程序。

给定一个数字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");
}

posted @ 2012-07-25 09:17  申龙斌的程序人生  阅读(502)  评论(0)    收藏  举报