一个数字排列的小程序

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值