用递归实现n的排列

  acm算法经典入门  7.2   p116页 

N 的全排列生成  

尝试递归思想解决:先输出所有以1开头的全排列。(递归调用)

输出以2开头的全排列 (递归调用 )

输出 3开头的全排列 (递归调用)

...

输出以n开头的全排列

1开头的排列特点是 第一位是1,后面是 2-9按字典序的排列。

按字典序列输出 2-9的排列,输出时候最后加上前面那个1

递归函数需要以下参数

1. 已经确定的前缀序列

2. 需要进行全排列的元素集合,以便一次选做第一个元素。

伪代码


Void printf_permutation(序列A 集合S )

{

If(s为空 ) 输出序列a

Else  按照从小到大的顺序依次考虑s 的每个元素 v

{  printf_permutation(在A的末尾添加过v后得到的新序列,s-v);

}

 

 

}



蓝桥杯的编译器 不 return ;会死机;

/*

凑算式


     B      DEF
A + --- + ------- = 10
     C      GHI
     
(如果显示有问题,可以参见【图1.jpg】)
 
 
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。


比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。


这个算式一共有多少种解法?


注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
*/
/*

#include"stdio.h"
int num[11];
long long int ans;
void solve()
{  double  t;
 t = num[0]+(double)num[1]/num[2]+ (double ) (num[3]*100+num[4]*10+num[5])/( num[6]*100+num[7]*10+num[8]*1) ;
   if (t==10)
      ans++;
 } 
void qpl(int cur) //cur 变量用来记录是排列的第几位了 
{  int i,j;
  if (cur==9) 
    {   solve() ;
        return ;
   
}
   for (i=1;i<10;i++)
     {
       int ok=1;//ok 用ok变量,来保证排列没有重复出现的数字。 
       for (j=0;j<cur;j++)
        {
        if(num[j]==i)
           ok =0;
}
       if (ok==1)
          {
          num[cur] =i;
          qpl(cur+1);
 }
}

}


int main()
{
qpl(0);
printf("%lld \n",ans); 
return 0;
}

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值