next_permutation(a, a+n)- при вызове в цикле выдаёт последовательно все перестановки массива a
--------------------------------------------
07_MarB. Cows Of The Round Table
http://dl.gsu.by/task.jsp?nid=143195&cid=15
Идея решения - генерируем все перестановки и проверяем каждую
на выполнение требования. Если требование выполнено - инкрементируем
ответ.
Чтобы исключить многократный учёт одинаковых перестановок сдвинутых
по кругу, фиксируем начальный элемент (0). И next_permutation вызываем
для элементов с 1 по n-1 включительно.
next_permutation переставляет указанные элементы в новую перестановку
в лексикографическом порядке, если перестановка не повторялась,
возвращает true, если получилась начальная перестановка - возвращает
false
Полный текст решения
#include <bits/stdc++.h>
using namespace std;
int n,k,m[12],a[12];
bool Good()
{
int i;
for (i=0; i<n && abs(m[a[i+1]]-m[a[i]])<=k ; i++);
return i==n;
}
int main()
{
ifstream cin("round.in");
ofstream cout("round.out");
cin >> n >> k;
for (int i=0; i<n; i++)
{
cin >> m[i];
a[i]=i;
}
a[n]=0;
int ans=0;
do if (Good()) ans++;
while(next_permutation(a+1, a+n));
cout << ans;
}