编写算法用计算机解决钟鸣问题
已知有12口编钟,随机敲响,那么有多少种全排列?
我们发现,可以把较短的排列加入一个最高位进行挪位后生成长一个元素的排列。
于是我们联想到递归思想。
那么如何把用计算机进行全排列呢?
这里采用字典序。
这里我们可以发现,按照字典序法,最后一个排列应该是321,从右向左进行扫描,应当是左侧数字严格大于右侧。
1.
2.这里1比3小,因此应当让比后缀(下降点后面的序列)里1大的最小的数字,即2与1进行交换,此时后缀是31,不是最小后缀,所以31交换换成为213,如此循环往复,即可以得到全部的排列。
sjt算法
定义一个新的概念:可移动数
1.给排列中所有数字指向左方。
2.最大的可移动数依次与左侧相邻数不断进行交换直到端点,同时生成一个个排列。
3.这时最大的数不能动了,此时最大的可移动数与指向方向的邻位数进行交换,随后所有可移动数的方向指向变反。
4.此时最大的可移动数依次与指向方向的数换位...
......循环往复即可得到所有序列。
函数实现及调用方式