题目描述:
给出正整数n,则1到n这n个数可以构成n!个排列。排列的邻位互换法是所有n!个排列的一种次序,使得每两个相邻的排列都只有相邻的两个数发生了位置互换。
例如在n=3时,所有6个排列的邻位互换次序为1 2 3, 1 3 2, 3 1 2, 3 2 1, 2 3 1, 2 1 3.
任务描述:
给出一个数 n 和 k ,求 1 到 n 排列中按邻位互换次序下的第 k 个排列。
比如: n = 3 , k=2 ,则答案是 1 3 2 。
#include "iostream"
#include "algorithm"
using namespace std;
#define N 2000
int data_[N];
int n;
void exch(int *s, int *b)
{
int c = *s;
*s = *b;
*b = c;
}
int find_next()
{
int k = 0, flag = 0;
for (int i = n - 1; i > 0; i--)
{
if (data_[i] > data_[i - 1])
{
k = i - 1;
flag = 1;
break;
}
}
if (flag == 0)
{
return 0;
}
int f = k + 1;
for (int i = k + 1; i < n; i++)
{
if (data_[i] > data_[k])
{
if (data_[f] > data_[i])
{
f = i;
}
}
}
exch(&data_[k], &data_[f]);
sort(data_ + k + 1, data_ + n);
return 1;
}
int main()
{
int t, m;
cin >> t;
while (t--)
{
cin >> n >> m;
for (int i = 0; i < n; i++)
{
cin >> data_[i];
}
for (int i = 0; i < m; i++)
{
if (!find_next())
{
for (int i = 1; i <= n; i++)
{
data_[i - 1] = i;
}
}
}
for (int i = 0; i < n - 1; i++)
{
printf("%d ", data_[i]);
}
printf("%d\n", data_[n - 1]);
}
return 0;
}