一个数字排列的小程序
还是大学时学了递归和回溯算法时,写的一个数字排列的小程序。
给定一个数字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"); }
----==== Email: slofslb (GTD) qq.com 请将(GTD)换成@ ====----
版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
作者:申龙斌的程序人生
---- 魔方、桥牌、象棋、游戏人生...
---- BASIC、C++、JAVA、C#、Haskell、Objective-C、Open Inventor、程序人生...
---- GTD伴我实现人生目标
---- 区块链生存训练
---- 用欧拉计划学Rust编程
---- 申龙斌的读书笔记(2011-2019)
----
 
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号