...9的9个数放入这个数组,也求出所有可能。c语言实现。说一下思路或者...
发布网友
发布时间:2024-03-07 23:20
我来回答
共1个回答
热心网友
时间:2024-03-08 02:39
这是全排列的问题。
全排列算法:
如果我求得固定第一位后的排列,那么全部排列就可以求出,固定第一位有10种可能,可以循环求得。
如果我求得固定第二位后的排列,固定第一位后的排列就可以求出,固定第二位有9种可能,可以循环求得。
。。。
如果我求得固定第10位后的排列,固定第9位后的排列就可以求出,固定第10位有1种可能,可以循环求得。
这很明显是递归的算法。
#include <stdio.h>
int n,a[10]; /*a[1],a[2],…,a[n]构成n个数的一个排列*/
long count=0; /*变量count记录不同排列的个数,这里用于控制换行*/
void perm(int k) /*定义函数perm( )*/
{
int j,p,t;
if(______①k==n______) /* ==是判断符号 =是赋值符号 循环1*/
{
count++;
for(p=1;p<=n;p++) printf("%1d",a[p]); /* "%1d" 中是数字1,不是字母l 输出a[1],a[2],......a[n]*/
printf("");
if(______②count%5==0 ______) printf("\n");/* 每输出5个排列换一次行*/
return;
}/* 当k==n时,进入循环1*/
for(j=k;j<=n;j++)
{
t=a[k];a[k]=a[j];a[j]=t;/* 交换a[k]和a[j]的位置*/
______③perm(k+1)______;
t=a[k];______④a[k]=a[j]; a[j]=t______;/* 交换a[k]和a[j]的位置*/
}
}
main()
{
int i;
printf("Entry n:\n"); scanf("%d",&n); /* 输入的数存贮到n上*/
for(i=1;i<=n;i++) a[i]=i;
}
讲解一下perm:
设perm(int k)为全部排列的集合,k为数字的位置
perm(int k){
for(j=k;j<=n;j++) //循环数组,确定k位的数值
{
t=a[k];a[k]=a[j];a[j]=t;/* 交换a[k]和a[j]的位置,目的是为了确定k位的数值*/
______③perm(k+1)______;//求得确定k位后的全部序列
t=a[k];______④a[k]=a[j]; a[j]=t______;/* 交换a[k]和a[j]的位置*/
}
}