用递归实现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;
}