//To musisz miec przygotowane przed
int[] tab1 = { wczytaj liczby};
tab.sort();
int[] tablicaPom = {przepisz liczby z tab1} // PRZEPISZ a nie przekazuj referancje
Dictionary<int,int> parse; // diciornary to dotnetowa nazwa #tablicy
for(i =0, i<tablicaPom.lenght ;i ++) // żeby wykonać parsowanie w czasie liniowy
{
parse.add(tablicaPom[i],i);
}
//funkcja
int[] Parsuj(Dictionary<int,int> parse, int[] toParse) //Przepisuje Ci permutacje liczb na permutajce "wskaźników"
// jest to ważne ponieważ ilość pól w tablicy jest zgóry określona, skonczona i uporządkowana i nie obchodzi Cie jaki typ danych
//przechowuje tablica
int[] outPut;
for(i=0;i<toParse.lenght,i++)
outPut[i] = parse.GetKey(toParse[i]);
return output
//funkajca
OminPermutacje(int[] tab,int[] subTab,Dictionary<int,int> parse) // nie kontroluje danych Ty powinieneś ;)
int[] P =Parsuj(parse,tab,);
int[] S =Parsuj(parse,subTab);
if(s.lenght == 0) //np. P= 0123 s= null
//twójPomysl
if(P[S.lenght-1]== S.lenght-1) // najwieksza mozliwa liczba dla 01234 to 4
if(S.lenght==1) // np 3210 i 3
// tu chciałeś false...
else
temp =ZnadzNajbliże(S,S[S.lenght - 1],P.lenght) // indeks najblizszej wartosci
Zamien(P, temp,S.lenght-2) // tablica[] indeks1 indeks2
Sortuj(P,S.lengh-2) //Sortuj przez w stawienie badź zliczenie tablice P odpodanego indeksu do konca)
else
temp =ZnadzNajbliże(S,S[S.lenght - 1],P.lenght) // tablica do przeszukania, wartosc, zakres
Zamien(P, temp,S.lenght-1) // tablica[] indeks1 indeks2
Sortuj(P,S.lengh-1) //Sortuj przez w stawienie badź zliczenie tablice P odpodanego indeksu do konca)
// to co teraz masz w P to indeksy do wartosci z tablicaPomocnicza nowej permutacji
int[] nPermutacja
for(i=0;i<p.lenght, i++)
nPermutacja[i] = tablicaPomocnicza[P[i]];
// funkcja
ZnadzNajbliże(int[] S, int value, int n) //dla P = 0 3 5 1 2 4 n jest równe 6
int[] temp;
for(i=0, i<s.lenght, i++)
temp[i] = (S[i] + n - value)%n;
return temp.Min();
Potrafił bym to ąłtwo wytłumczyć na papierze ale z poziomu forum nie da rady :/