显然,直接用STL中的next_permutation(p,p+n)可以很快速得出下一个排列(见算法竞赛入门经典(第二版) P187)
但这道题的重点是理解怎么求下一个排列的方法,
下面是常规方法求解思路
设P是一个排列串:P = s[1]s[2]...s[n] = s[1]...s[j]...s[k]...s[n]
1)从当前排列串的右端开始,找出第一个比右边数字小的数字的序号j
(j从左端开始计算),即 j=max{i|s[i]<s[i+1]};
2)在s[j]的右边的数字中,找出所有比s[j]大的数中最小的数字s[k],
即 k=max{i|s[i]>s[j]}
(对s[j]右边数来说,从右至左是递增的,因此k是所有大于s[j]的数字中序号最大者,
序号虽最大但s[k]是处于s[j]右边且比s[j]大的数中的最小者);
3)交换s[j]和s[k];
4)再将s[j+1]...s[k-1]s[k]s[k+1]...s[n]倒转得到排列
P' &#