Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace ketszemelyesV3
- {
- class Program
- {
- static void Main(string[] args)
- {
- List<Csucs> fa = new List<Csucs>();
- treeSetup(fa);
- Console.WriteLine("##################### LISTA #####################");
- kiirFullLista(fa);
- globaljatekfa.Add(new Jatekfa(0, 0, 0, fa));
- Console.WriteLine("##################### JATEKFAK #####################");
- jatekfaFeltolt(globaljatekfa);
- foreach (Jatekfa jatekfa in globaljatekfa)
- jatekfa.kiir();
- Console.ReadKey();
- }
- static void treeSetup(List<Csucs> lista)
- {
- /*
- * A
- * B C
- * D E F G H
- * I J K L
- *
- */
- lista.Add(new Csucs(0, 1, "A"));
- lista.Add(new Csucs(1, 2, "B"));
- lista.Add(new Csucs(1, 3, "C"));
- lista.Add(new Csucs(2, 4, "D"));
- lista.Add(new Csucs(2, 5, "E"));
- lista.Add(new Csucs(2, 6, "F"));
- lista.Add(new Csucs(3, 7, "G"));
- /*lista.Add(new Csucs(3, 8, "H"));
- lista.Add(new Csucs(4, 9, "I"));
- lista.Add(new Csucs(4, 10, "J"));
- lista.Add(new Csucs(6, 11, "K"));
- lista.Add(new Csucs(8, 12, "L"));
- */
- foreach (Csucs item in lista)
- {
- foreach (Csucs item2 in lista)
- {
- if (item.sorszam != item2.sorszam && item.sorszam == item2.szulosorszam)
- {
- item.gyerekekInt.Add(item2.sorszam);
- item.gyerekekString.Add(lista.Where(x => x.sorszam == item2.sorszam).First().nev);
- }
- }
- item.letezik = 1;
- }
- }
- public static void kiirFullLista(List<Csucs> lista)
- {
- //Console.WriteLine("###############\t Lista\t##################");
- foreach (Csucs item in lista)
- {
- if (item.letezik == 1)
- {
- if(item.szulosorszam == 0)
- Console.Write(item.sorszam + ".\t" + item.nev + "\t(szulo: * gyerekei:");
- else
- Console.Write(item.sorszam + ".\t" + item.nev + "\t(szulo: " + item.szulosorszam + " gyerekei:");
- if (item.gyerekekInt.Count != 0)
- {
- foreach (int item2 in item.gyerekekInt)
- {
- Console.Write(" " + item2 + "(" + lista.Find(x => x.sorszam == item2).nev + ")");
- }
- }
- else
- Console.Write(" nincs gyereke");
- Console.WriteLine(")");
- }
- }
- Console.WriteLine("\n\n");
- }
- public static List<Jatekfa> globaljatekfa = new List<Jatekfa>();
- static void megold(List<Jatekfa> jf)
- {
- List<Jatekfa> localjf = jf.ToList();
- // Végigmegyünk az globaljatekfa összes elemén és hogy ha még nincs kiterjeszve, akkor kiterjesztjük
- foreach (Jatekfa jatekfa in localjf.Where(x=>x.kiterjesztve == 0))
- {
- int canbechanged = 0;
- // Ha nincs kiterjesztve a fa, akkor nézzük csak meg, hogy az adott fából lehet-e törölni csúcs gyerekeit, ha lehet, akkor a canbechanges változót egyre állítjuk
- if (jatekfa.kiterjesztve == 0)
- foreach (Csucs csucs in jatekfa.adottFaAllapot)
- if(csucs.letezik == 1 && csucs.szulosorszam != 0)
- canbechanged = 1;
- // Ha lehet gyereket törölni az adott fából, akkor a fáról egy lokális másolatot készítve szerkesztjük a fát az összes lehetséges állapotra from i = 0 to i = localcopy.Count() és létezzen a csúcs.
- // Ezeket a szerkesztett állapotokat hozzáadjuk a globális jatekfa listához kiterjesztve=0-val, amit vizsgáltunk, ott pedig jatekfa.kiterjesztve = 1
- if(canbechanged == 1)
- {
- globaljatekfa.Find(x => x == jatekfa).kiterjesztve = 1;
- //jatekfa.kiterjesztve = 1;
- // Jatekfa állapotok elmentése, hogy rekurzív hívásnál feltudjuk használni egyszerűen
- int szulo = jatekfa.sorszam+1;
- int lepes = jatekfa.lepes+1;
- // Update: Ha több elem létezik, mint gyökér, akkor lehet még törölni
- if (jatekfa.adottFaAllapot.Where(x => x.letezik != 0).Count() > jatekfa.adottFaAllapot.Where(x=>x.szulosorszam == 0).Count())
- {
- // Az összes csúcson végigmegyünk
- for (int i = 1; i <= jatekfa.adottFaAllapot.Count(); i++)
- {
- //Console.WriteLine("iteration: " + i);
- // Lokalis lista letrehozasa a fa adott allapotarol
- List<Csucs> listacopy = new List<Csucs>();
- foreach (var csucs in jatekfa.adottFaAllapot)
- listacopy.Add(new Csucs(csucs.szulosorszam, csucs.sorszam, csucs.nev, csucs.letezik, csucs.gyerekekInt.ToList(), csucs.gyerekekString.ToList()));
- // Ha a vizsgált csúcs létezik, viszont nincs gyereke, akkor nem lehet vele mit csinálni
- int sorszam = i;
- if (listacopy.Where(x => x.sorszam == sorszam && x.letezik == 1 && x.gyerekekInt.Count() == 0).Count() != 0)
- continue;
- // Ha törölni lehet a vizsgált csúcs gyerekeit
- else
- {
- //Console.WriteLine(i);
- // unoka.szulosorszam updateje: gyerekek kigyűjtése listába és ezeken végigmenve a szülőjének a gyökér csúcsot (0) adjuk meg
- List<int> unokak = new List<int>();
- foreach (Csucs gyerek in listacopy.Where(x => x.szulosorszam == sorszam))
- foreach (int unoka in gyerek.gyerekekInt)
- unokak.Add(unoka);
- foreach (Csucs item in listacopy)
- if (unokak.Contains(item.sorszam) && item.letezik == 1)
- item.szulosorszam = 0;
- // szülő gyerekeinek logikai törlése
- foreach (int gyereke in listacopy.Find(x => x.sorszam == sorszam).gyerekekInt)
- {
- foreach (var csucs in listacopy)
- {
- if (csucs.sorszam == gyereke)
- {
- listacopy.Find(x => x.sorszam == csucs.sorszam).letezik = 0;
- listacopy.Find(x => x.sorszam == csucs.sorszam).gyerekekInt.Clear();
- listacopy.Find(x => x.sorszam == csucs.sorszam).gyerekekString.Clear();
- }
- }
- }
- // szülő gyerekeinek updateje
- listacopy.Find(x => x.sorszam == sorszam).gyerekekInt.Clear();
- listacopy.Find(x => x.sorszam == sorszam).gyerekekString.Clear();
- // törlés után a lehetséges állapotot hozzáadjuk a globalfahoz
- if (globaljatekfa.Where(x=>x.adottFaAllapot == listacopy).Count() == 0)
- {
- kiirFullLista(listacopy);
- globaljatekfa.Add(new Jatekfa(szulo, lepes, globaljatekfa.Count(), listacopy));
- megold(globaljatekfa);
- }
- }
- } // Az összes csúcson ezzel a forral mentünk végig
- } // Update: Ha a fából lehet törölni
- } // Ha a fából lehet törölni
- else globaljatekfa.Find(x => x == jatekfa).kiterjesztve = 1;
- } // Foreach az összes játékfára
- } // End of megold
- } // End of class Program
- public class Csucs
- {
- public int szulosorszam;
- public int sorszam;
- public String nev;
- public int letezik;
- public List<int> gyerekekInt = new List<int>();
- public List<String> gyerekekString = new List<string>();
- public Csucs(int szulosorszam, int sorszam, String nev)
- {
- this.szulosorszam = szulosorszam;
- this.sorszam = sorszam;
- this.nev = nev;
- this.letezik = 1;
- }
- public Csucs(int szulosorszam, int sorszam, String nev, int letezik, List<int> gyerekekInt, List<String> gyerekekString)
- {
- this.szulosorszam = szulosorszam;
- this.sorszam = sorszam;
- this.nev = nev;
- this.letezik = letezik;
- this.gyerekekInt = gyerekekInt.ToList();
- this.gyerekekString = gyerekekString.ToList();
- }
- }
- public class Jatekfa
- {
- public int szulo;
- public int lepes;
- public int sorszam;
- public List<Csucs> adottFaAllapot;
- public int kiterjesztve;
- public Jatekfa(int szulo, int lepes, int sorszam, List<Csucs> adottFaAllapot)
- {
- this.szulo = szulo;
- this.lepes = lepes;
- this.sorszam = sorszam;
- this.adottFaAllapot = adottFaAllapot;
- this.kiterjesztve = 0;
- }
- public Jatekfa(int szulo, int lepes, int sorszam, List<Csucs> adottFaAllapot, int kiterjesztve)
- {
- this.szulo = szulo;
- this.lepes = lepes;
- this.sorszam = sorszam;
- this.adottFaAllapot = adottFaAllapot;
- this.kiterjesztve = kiterjesztve;
- }
- public void kiir()
- {
- Console.WriteLine("JATEKFA\t" + (this.sorszam+1) + ". elem (szulo : " + this.szulo + ", " + this.lepes + ". lepes)");
- ketszemelyesV3.Program.kiirFullLista(this.adottFaAllapot);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement