Здравствуйте, Starlight, Вы писали:
...
S>3. Дан массив целых чисел int A[N]. Напечатать все возможные перестановки (каковых будет N!). Алгоритмов можно придумать много, но меня еще дополнительно попросили алгоритм без выделений дополнительной памяти и in-place.
...
Алгоритм 3 без выделений дополнительной памяти и in-place показался тяжеловатым для интервью под стрессом. Вот что удалось придумать ничем не пользуясь:
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
bool stop = argc < 2;
for (int i = 1; !stop; ++i)
{
// output
int j;
for(j = 1; j < argc; ++j)
cout << argv[j] << ((j == argc - 1)? "\n" : " ");
j = 2;
for (int buf = 2; 0 == (i % buf); buf *= (++j))
;
j = argc - j;
if (j < 1)
{
j = 1;
stop = true;
}
reverse(argv + j, argv + argc);
}
return 0;
}
Казалось бы просто, но пришлось-таки поломать голову. Непонятно, что, может, попроще, мог упустить и где?