public ILejátszható[] Elsőelemre(LáncoltLista <ILejátszható> tartalom) { ListaElem <ILejátszható> aktualis = tartalom.Fej; //6 stílust használok, ezáltal 6 elemű a tömbböm, amibe eltárolom az első elemre vonatkozó referenciákat. string[] stilusok = new string[] { "Családias", "Mulatós", "Rock", "Elektronikus", "Romantikus", "Akció" }; int stilus_index = 0; int db = stilusok.Length; ILejátszható[] elsőelemekreRef = new ILejátszható[db]; int elsőre_index = 0; while (stilus_index < db && aktualis != null) { if (aktualis.Következő == null && elsőelemekreRef[elsőre_index] == null) { stilus_index += 2; aktualis = tartalom.Fej; elsőelemekreRef[elsőre_index++] = aktualis.Érték; } else if (aktualis.Érték.Stílus == stilusok[stilus_index]) { elsőelemekreRef[elsőre_index++] = aktualis.Érték; stilus_index++; } aktualis = aktualis.Következő; } return(elsőelemekreRef); }
//Az elsőelemek megtalálása: egy int db változóba eltárolom a tartalom méretét, majd a egy tmp tömböt ezzel a mérettel inicializálok. Ebbe a tmp tömbbe kerülnek bele a referenciák. //A megvalósítás:Először feltöltöm a tömböt a tartalom összes elemével, majd deklarálok egy index változót ami a legelső elemre mutat, és ezt is használom az if első vizsgálandó elemének indexelésére. //Amíg a soron következő elemek stílusa azonos az elsővel, addig azokat törlöm, ha különböznek, akkor az index értéket fölülírom az i-vel így az az éppen aktuális elemre fog mutatni, aminek pont eltér a stílusa //az eddig vizsgálttól. Ezután folytatódik a ciklus és vizsgálja, hogy a következő elem azonos-e az index-edik elem stílusával és ha igen, törli, ha nem átlépteti az indexet az aktuális elemre és így tovább. public void TartalomÖsszeállítás(LáncoltLista <ILejátszható> tartalom) { int stilusDb = 0; int támogatott_index = 0; try { stilusDb = Db(); } catch (TulnagyASzam e) { Console.WriteLine(e.Message); TartalomÖsszeállítás(tartalom); } Console.WriteLine(); string[] támogatottStílusok = new string[stilusDb]; //meghívom a műfajra kiválogatott listán ami már csak azokat a műfajokat tartalmazza amiket a felhasz engedett bool kilep = false; while (kilep == false) { try { támogatottStílusok = TámogatottStílusok(stilusDb, támogatott_index); kilep = true; } catch (NemLetezoStilus e) { Console.WriteLine(e.Message); } } Console.WriteLine(); int műsorhossz = 0; Dictionary <string, List <ILejátszható> > válogatottTartalom = Válogatás(tartalom, támogatottStílusok); LáncoltLista <ILejátszható> osszefuzott = new LáncoltLista <ILejátszható>(); osszefuzott = ElejereOsszeFuzes(válogatottTartalom); int meret = osszefuzott.Count(); int marker = 0; ILejátszható[] eredmeny = new ILejátszható[meret]; //osszefuzott.BackTrack() Console.WriteLine(); foreach (var item in osszefuzott) { Console.WriteLine(item); } }
//public void BackTrack(ref int limit, ref int totalcost, ref int marker, ILejátszható[] eredmeny) //public void BackTrack(ref int műsorhossz, ref int totalcost, ref int marker, ILejátszható[] eredmeny) //{ // ListaElem<ILejátszható> start = null; // BackTrack(fej, 0, limit, 0, eredmeny, ref limit, ref totalcost, ref marker, start); // BackTrack(fej,0,műsorhossz,) // //BackTrack(fej,) //} private void BackTrack(ListaElem <ILejátszható> fej, int szint, int remaining, int cost, ILejátszható[] eredmeny, ref int pool, ref int totalcost, ref int marker, ILejátszható before) { ListaElem <ILejátszható> mappoint = new ListaElem <ILejátszható>(before); int temptime; int tempcost; while (fej != null) { mappoint.Érték = fej.Érték; temptime = remaining - fej.Érték.Hossz; tempcost = cost + fej.Érték.SzerzőiJogdíj; if (temptime >= 0) { BackTrack(fej.Következő, szint + 1, temptime, tempcost, eredmeny, ref pool, ref totalcost, ref marker, mappoint); if (temptime < pool) { pool = temptime; totalcost = tempcost; marker = szint; Eredmeny(szint, eredmeny, mappoint); } else if (temptime == pool && tempcost < totalcost) { totalcost = tempcost; marker = szint; Eredmeny(szint, eredmeny, mappoint); } } } }