有个9单元的数组,将1-9的9个数放入这个数组,也求出所有可能。c语言实现。说一下思路或者算法就好

有个9单元的数组,将1-9的9个数放入这个数组,也求出所有可能。c语言实现。说一下思路或者算法就好了

这是全排列的问题。
全排列算法:
如果我求得固定第一位后的排列,那么全部排列就可以求出,固定第一位有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]的位置*/
}
}追问

你的没看懂,不过我自己想出方法了

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网