排列与组合-计算出n个整数的全排列种数,并输出这所有的排列。

第一招:深度优先搜索
#include 
int a[10],book[10],n;
void dfs(int tnt)
{
    int i;
  if(tnt==n+1)
  {
    for(i=1;i<=n;i++)//输出一种排列 
     printf("%d ",a[i]);
    printf("\n");
    return;
  }
  for(i=1;i<=n;i++)
  {
    if(book[i]==0)
    {
      a[tnt]=i;
      book[i]=1; 
	  //book[i]=0;
      dfs(tnt+1);
     book[i]=0;//回溯还原,为下一次排列作准备 
    }
  }
  return;
}
int main()
{
    int i;
    scanf("%d",&n);
    int count=1;
    for(i=1;i<=n;i++)
       count*=i;   
     printf("%d\n",count);//计算种数 
    dfs(1);//从1号开始深搜 
    return 0;
}

第二招:对于每个排列逐个交换

#include 
void swap(int *a, int *b)
{
	int t = *a;
	*a = *b;
	*b = t;
}
void sort(int a[], int begin, int end)
{
	int i;
	if (begin >= end) // 找到一个排列
	{
		for (i = 0; i < end; i++)
			printf("%d ", a[i]);
		printf("\n");
	}
	else// 没有找完一个排列,则继续往下找下一个元素
	{
		for (i = begin; i < end; i++)
		{
			if (begin != i)
				swap(&a[begin], &a[i]); // 交换
			sort(a, begin + 1, end);
			if (begin != i)
				swap(&a[begin], &a[i]); // 回溯时还原
		}
	}
}
int main()
{
	int a[10];
	int i,n,sum;
	scanf("%d", &n);
	// 初始化数组
	for (i = 0; i < n; i++)
		a[i] = i + 1;
    sum=1;
    for (i = 1; i <= n; i++)
        sum*=i;
    printf("%d\n",sum);
	sort(a, 0, n);
	return 0;
}

组合输出:n个整数取m个数的组合

#include 
int n,m,a[30];
void dfs(int k)
{
	int i;
	if(k>m)
	{
		for(i=1;i<=m;i++)
		  printf(i==1?"%d":" %d",a[i]);
		printf("\n");
	 return;
	}
	for(i=a[k-1]+1;i<=n;i++)
	{
		a[k]=i;
		dfs(k+1);
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	 dfs(1);
	 return 0;
}
/*
3 2
1 2
1 3
2 3
*/




你可能感兴趣的:(数学思想)