有c++和pascal标程,看不懂,随便解释哪个程序都行.【问题描述】对于正整数N,则1到N这N个数可以构成N!种排列,把这些排列按照字典序从小到大列出.如N=3时,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1六个排
来源:学生作业帮助网 编辑:六六作业网 时间:2025/01/18 16:57:10
有c++和pascal标程,看不懂,随便解释哪个程序都行.【问题描述】对于正整数N,则1到N这N个数可以构成N!种排列,把这些排列按照字典序从小到大列出.如N=3时,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1六个排
有c++和pascal标程,看不懂,随便解释哪个程序都行.
【问题描述】
对于正整数N,则1到N这N个数可以构成N!种排列,把这些排列按照字典序从小到大列出.
如N=3时,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1六个排列.
现在,给你排列{Pi},请你计算它后面的第K个排列{Qi}.
注意:这N!个排列是循环的,例如3 1 2后面的第2个排列是1 2 3.
【输入文件】
\x05两行,按如下格式:
N,k 意义如题
n的一个排列,两个数间空格隔开
【输出文件】
\x05一行,按如下格式输出所求排列:
所求排列P1~pn,两个数间空格隔开
【输入样例】
3 2
1 3 2
【输出样例】
2 3 1
【数据规模】
\x05四类测试点
类别\x05数量\x05数据描述
1\x053\x051
有c++和pascal标程,看不懂,随便解释哪个程序都行.【问题描述】对于正整数N,则1到N这N个数可以构成N!种排列,把这些排列按照字典序从小到大列出.如N=3时,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1六个排
表示看程序很头大,但我可以给你一个很清晰的算法:
· 从后往前找,直到找到序列第一次下降为止,找到k,在第i位.
· 从该位置向后找,找到最小一个比改为数字大的数字,找到m,在第j位.
· 交换k, m这两个数字.
· 将排列的第i+1位到末尾倒转,即得到了下一个排列.
具体细节和程序实现(pascal)见:http://www.clarkok.com/blog/?p=134