TO: woshiyun
经过您的提醒,发现我的全排列中有错误,导致无法全部排列组合。下面的程序已经改正,输出时确时是3组数据,多了个 4 1 2 3。
程序代码:
/*----------------------------------------------------------------------------- 输入一个数 n.表示有n个数(n从1开始),再输入一个m,表示下面输入m组数,规定前 一个数在后一数的前面,输出这列数,如: 4 3 1 2 2 3 4 3 1 2 4 3 ------------------------------------------------------------------ 用全排列来作的这个程序,然后在输出时加上限制。不过在输入试验用的 数据时却出现了两个结果。 我的这个程序中的“规定前一个数在后一个数的前面”这个条件,是指的同 一组数据,在仔细思考这个题意时,也没发现理解错误。 如有高手肯出手指教,不胜感激。 ----------------------------------------------------------------------------*/ #include <stdio.h> #include<string.h> #define N 100 #define wap(a,b) {int t=a;a=b;b=t;} int m,n; int num[N]; int a[N]; /* 检查函数,用于检查输入的数据中是否有超过边界条件的 */ int check() { int i=0; for(;i<m*2;++i) if(num[i]>n||num[i]<1) return 0; /* 如果有错误的输入,返回 0 */ return 1; } /*-----输入函数----------------------------*/ void input() { int i; printf("input n and m:\n"); scanf("%d %d",&n,&m); for(i=0;i<m*2;i+=2) scanf("%d %d",&num[i],&num[i+1]); if(!check(num)) { printf("error\n"); exit(0); /* 如果发现数值不正确,退出 */ } for(i=0;i<n;++i) a[i]=i+1; /* 用于输出的数组赋值 */ } /*------------------输出函数--------------------*/ void print() { int *a1,*a2; int i; for(i=0;i<m*2;i+=2) { a1=a2=a; while(a1<a+n) { if(num[i]==*a1) break; a1++; /* 如果发现相同的数据,退出循环 */ } while(a2<a+n) { if(num[i+1]==*a2) break; a2++; /* 同上 */ } if(a1>a2) return; /* 如果发现数据的位置不正确,返回 */ } for(i=0;i<n;++i) printf("%d ",a[i]); printf("\n"); /* 输出正确的数列 */ } /*-----------------全排列函数--------------*/ void SORT(int k) { int i; if(k+1==n) { print(); return ; } for(i=k;i<n;++i) { wap(a[k],a[i]); SORT(k+1); wap(a[k],a[i]); } } int main(void) { input(); SORT(0); return 0; }