#include <stdio.h>
#include <stdlib.h>
#define BOOL int
#define TRUE (-1)
#define FALSE (0)
int *Generate(int n, int s1, int s2);
BOOL GenerateNext(int i, int *xs, int n, int s1, int s2);
void Shuffle(int *arr, int n);
int main(void)
{
int n = 20, s1 = 2, s2 = 5;
int i;
int *xs = Generate(n, s1, s2);
if (xs == NULL)
{
printf("No valid permutations.\n"); }
else
{
for (i = 0; i < n; i++)
{
}
}
}
int *Generate(int n, int s1, int s2)
{
int *xs
= (int *) malloc(sizeof(int) * n
); if (GenerateNext(0, xs, n, s1, s2))
{
return xs;
}
return NULL;
}
BOOL GenerateNext(int i, int *xs, int n, int s1, int s2)
{
int candidates[n];
int nCandidates = 0, candidate, j, delta;
BOOL ok;
if (i == n) return TRUE;
for (candidate = 0; candidate < n; candidate++)
{
ok = TRUE;
for (j = 0; j < i && ok; j++)
{
if (xs[j] == candidate) ok = FALSE;
else if ((i - j) <= s1)
{
int delta = xs[j] - candidate;
if (delta < 0) delta = -delta;
if (delta <= s2) ok = FALSE;
}
}
if (ok)
{
candidates[nCandidates++] = candidate;
}
}
if (nCandidates == 0) return FALSE;
Shuffle(candidates, nCandidates);
for (j = 0; j < nCandidates; j++)
{
xs[i] = candidates[j];
if (GenerateNext(i + 1, xs, n, s1, s2))
{
return TRUE;
}
}
return FALSE;
}
void Shuffle(int *arr, int n)
{
int i, j, tmp;
for (i = 0; i < n; i++)
{
j
= i
+ rand() % (n
- i
); if (j != i)
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgQk9PTCBpbnQKI2RlZmluZSBUUlVFICgtMSkKI2RlZmluZSBGQUxTRSAoMCkKCmludCAqR2VuZXJhdGUoaW50IG4sIGludCBzMSwgaW50IHMyKTsKQk9PTCBHZW5lcmF0ZU5leHQoaW50IGksIGludCAqeHMsIGludCBuLCBpbnQgczEsIGludCBzMik7CnZvaWQgU2h1ZmZsZShpbnQgKmFyciwgaW50IG4pOwoKaW50IG1haW4odm9pZCkKewogICAgaW50IG4gPSAyMCwgczEgPSAyLCBzMiA9IDU7CiAgICBpbnQgaTsKICAgIGludCAqeHMgPSBHZW5lcmF0ZShuLCBzMSwgczIpOwogICAgaWYgKHhzID09IE5VTEwpCiAgICB7CiAgICAgICAgcHJpbnRmKCJObyB2YWxpZCBwZXJtdXRhdGlvbnMuXG4iKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBwcmludGYoIlBlcm11dGF0aW9uOiBbICIpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoaSA+IDApIHByaW50ZigiLCAiKTsKICAgICAgICAgICAgcHJpbnRmKCIlZCIsIHhzW2ldKTsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCIgXVxuIik7CiAgICAgICAgCiAgICAgICAgZnJlZSh4cyk7CiAgICB9Cn0KCmludCAqR2VuZXJhdGUoaW50IG4sIGludCBzMSwgaW50IHMyKQp7CiAgICBpbnQgKnhzID0gKGludCAqKSBtYWxsb2Moc2l6ZW9mKGludCkgKiBuKTsKICAgIGlmIChHZW5lcmF0ZU5leHQoMCwgeHMsIG4sIHMxLCBzMikpCiAgICB7CiAgICAgICAgcmV0dXJuIHhzOwogICAgfQogICAgZnJlZSh4cyk7CiAgICByZXR1cm4gTlVMTDsKfQoKQk9PTCBHZW5lcmF0ZU5leHQoaW50IGksIGludCAqeHMsIGludCBuLCBpbnQgczEsIGludCBzMikKewogICAgaW50IGNhbmRpZGF0ZXNbbl07CiAgICBpbnQgbkNhbmRpZGF0ZXMgPSAwLCBjYW5kaWRhdGUsIGosIGRlbHRhOwogICAgQk9PTCBvazsKCiAgICBpZiAoaSA9PSBuKSByZXR1cm4gVFJVRTsKCiAgICBmb3IgKGNhbmRpZGF0ZSA9IDA7IGNhbmRpZGF0ZSA8IG47IGNhbmRpZGF0ZSsrKQogICAgewogICAgICAgIG9rID0gVFJVRTsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgaSAmJiBvazsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHhzW2pdID09IGNhbmRpZGF0ZSkgb2sgPSBGQUxTRTsKICAgICAgICAgICAgZWxzZSBpZiAoKGkgLSBqKSA8PSBzMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50IGRlbHRhID0geHNbal0gLSBjYW5kaWRhdGU7CiAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPCAwKSBkZWx0YSA9IC1kZWx0YTsKICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8PSBzMikgb2sgPSBGQUxTRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAob2spCiAgICAgICAgewogICAgICAgICAgICBjYW5kaWRhdGVzW25DYW5kaWRhdGVzKytdID0gY2FuZGlkYXRlOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAobkNhbmRpZGF0ZXMgPT0gMCkgcmV0dXJuIEZBTFNFOwoKICAgIFNodWZmbGUoY2FuZGlkYXRlcywgbkNhbmRpZGF0ZXMpOwoKICAgIGZvciAoaiA9IDA7IGogPCBuQ2FuZGlkYXRlczsgaisrKQogICAgewogICAgICAgIHhzW2ldID0gY2FuZGlkYXRlc1tqXTsKICAgICAgICBpZiAoR2VuZXJhdGVOZXh0KGkgKyAxLCB4cywgbiwgczEsIHMyKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gRkFMU0U7Cn0KCnZvaWQgU2h1ZmZsZShpbnQgKmFyciwgaW50IG4pCnsKICAgIGludCBpLCBqLCB0bXA7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQogICAgewogICAgICAgIGogPSBpICsgcmFuZCgpICUgKG4gLSBpKTsKICAgICAgICBpZiAoaiAhPSBpKQogICAgICAgIHsKICAgICAgICAgICAgdG1wID0gYXJyW2ldOwogICAgICAgICAgICBhcnJbaV0gPSBhcnJbal07CiAgICAgICAgICAgIGFycltqXSA9IHRtcDsKICAgICAgICB9CiAgICB9Cn0K
Permutation: [ 3, 19, 13, 7, 0, 14, 8, 2, 15, 9, 1, 16, 10, 4, 17, 11, 5, 18, 12, 6 ]