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;
}








