Advertisement
kokusz19

MestInt.KetszemelyesV5.kms.beforeStartingAgain

May 27th, 2018
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 15.70 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace ketszemelyesV1
  8. {
  9.  
  10.     class Csucs
  11.     {
  12.         public int szulosorszam;
  13.         public int sorszam;
  14.         public String nev;
  15.         public int letezik;
  16.         public int eredmeny;
  17.  
  18.         public List<int> gyerekekInt = new List<int>();
  19.         public List<String> gyerekekString = new List<string>();
  20.  
  21.         public Csucs(int szulosorszam, int sorszam, String nev)
  22.         {
  23.             this.szulosorszam = szulosorszam;
  24.             this.sorszam = sorszam;
  25.             this.nev = nev;
  26.         }
  27.     }
  28.  
  29.     class Program
  30.     {
  31.         static void treeSetup(List<Csucs> lista)
  32.         {
  33.             /*
  34.              *                  A
  35.              *         B                C
  36.              *     D   E   F        G       H
  37.              *   I   J     K                L
  38.              *
  39.              */
  40.  
  41.             lista.Add(new Csucs(0, 1, "A"));
  42.             lista.Add(new Csucs(1, 2, "B"));
  43.             lista.Add(new Csucs(1, 3, "C"));
  44.             lista.Add(new Csucs(2, 4, "D"));
  45.             lista.Add(new Csucs(2, 5, "E"));
  46.             lista.Add(new Csucs(2, 6, "F"));
  47.             lista.Add(new Csucs(3, 7, "G"));
  48.             lista.Add(new Csucs(3, 8, "H"));
  49.             lista.Add(new Csucs(4, 9, "I"));
  50.             lista.Add(new Csucs(4, 10, "J"));
  51.             lista.Add(new Csucs(6, 11, "K"));
  52.             lista.Add(new Csucs(8, 12, "L"));
  53.             /**/
  54.             foreach (Csucs item in lista)
  55.             {
  56.                 foreach (Csucs item2 in lista)
  57.                 {
  58.                     if (item.sorszam != item2.sorszam && item.sorszam == item2.szulosorszam)
  59.                     {
  60.                         item.gyerekekInt.Add(item2.sorszam);
  61.                         item.gyerekekString.Add(lista.Where(x => x.sorszam == item2.sorszam).First().nev);
  62.  
  63.                     }
  64.                 }
  65.                 item.letezik = 1;
  66.             }
  67.         }
  68.  
  69.         static void kiirFullLista(List<Csucs> lista)
  70.         {
  71.             Console.WriteLine("###############\t   Lista\t##################");
  72.             foreach (Csucs item in lista)
  73.             {
  74.                 if (item.letezik == 1)
  75.                 {
  76.                     Console.Write(item.sorszam + ".\t" + item.nev + "\t(szulo: " + item.szulosorszam + " gyerekei:");
  77.                     if (item.gyerekekInt.Count != 0)
  78.                     {
  79.                         foreach (int item2 in item.gyerekekInt)
  80.                         {
  81.                             Console.Write("  " + item2 + "(" + lista.Find(x => x.sorszam == item2).nev + ")");
  82.                         }
  83.                     }
  84.                     else
  85.                         Console.Write("  level elem");
  86.                     Console.WriteLine(")");
  87.                 }
  88.             }
  89.             Console.WriteLine();
  90.         }
  91.  
  92.         static void csucsGyerekeiTorlese(List<Csucs> lista)
  93.         {
  94.             hiba: Console.WriteLine();
  95.             int sorszam = int.Parse(Console.ReadLine());
  96.  
  97.             if (lista.Find(x => x.sorszam == sorszam).gyerekekInt.Count() == 0)
  98.             {
  99.                 Console.WriteLine("Nincs gyereke a csucsnak, minimum egy gyereket torolni kell, valasszon ujra!");
  100.                 goto hiba;
  101.             }
  102.  
  103.  
  104.             else
  105.             {
  106.                 Csucs szulo = lista.Find(x => x.sorszam == sorszam);
  107.  
  108.                 // unoka.szulosorszam updateje  
  109.                 List<int> gyerekek = new List<int>();
  110.                 foreach (Csucs gyerek in lista.Where(x => x.szulosorszam == sorszam))
  111.                     foreach (int unoka in gyerek.gyerekekInt)
  112.                         gyerekek.Add(unoka);
  113.                 foreach (Csucs item in lista)
  114.                     if (gyerekek.Contains(item.sorszam) && item.letezik == 1)
  115.                         item.szulosorszam = sorszam;
  116.  
  117.                 // szülő gyerekeinek torlese
  118.                 foreach (int item in szulo.gyerekekInt)
  119.                 {
  120.                     foreach (var item2 in lista)
  121.                     {
  122.                         if (item2.sorszam == item)
  123.                             lista.Find(x => x == item2).letezik = 0;
  124.                     }
  125.                 }
  126.  
  127.                 // szülő.gyerekei update
  128.                 lista.Find(x => x.sorszam == sorszam).gyerekekInt.Clear();
  129.                 lista.Find(x => x.sorszam == sorszam).gyerekekString.Clear();
  130.                 foreach (Csucs item in lista)
  131.                 {
  132.                     if (item.szulosorszam == sorszam && item.letezik == 1)
  133.                     {
  134.                         lista.Find(x => x.sorszam == sorszam).gyerekekInt.Add(item.sorszam);
  135.                         lista.Find(x => x.sorszam == sorszam).gyerekekString.Add(item.nev);
  136.                     }
  137.                 }
  138.             }
  139.         }
  140.  
  141.         static void singlePlayer(List<Csucs> lista)
  142.         {
  143.             while (lista.Count() != 1)
  144.             {
  145.                 int elem = 0;
  146.                 foreach (var item in lista)
  147.                 {
  148.                     if (item.letezik == 1)
  149.                         elem++;
  150.                 }
  151.                 if (elem == 1) break;
  152.  
  153.                 csucsGyerekeiTorlese(lista);
  154.                 kiirFullLista(lista);
  155.             }
  156.         }
  157.  
  158.         static void check(List<Csucs> lista)
  159.         {
  160.             List<Csucs> listacopy = lista;
  161.             if (listacopy.Count() != 0)
  162.             {
  163.  
  164.                 listacopy.ForEach(delegate (Csucs a)
  165.                 {
  166.                     Console.Write(" " + a.nev);
  167.                 });
  168.                 Console.WriteLine();
  169.  
  170.                 listacopy.Remove(listacopy.Find(x => x.sorszam == listacopy.Max(y => y.sorszam)));
  171.                 check(listacopy);
  172.             }
  173.         }
  174.  
  175.  
  176.  
  177.  
  178.         public class Eredmenyek
  179.         {
  180.             public int kimenetel;
  181.             public int sorszam;
  182.             public int szulo;
  183.             public List<Eredmenyek> lista = new List<Eredmenyek>();
  184.  
  185.             public Eredmenyek(int kimenetel, int sorszam)
  186.             {
  187.                 this.kimenetel = kimenetel;
  188.                 this.sorszam = sorszam;
  189.             }
  190.             public Eredmenyek(int szulo, int kimenetel, int sorszam)
  191.             {
  192.                 this.szulo = szulo;
  193.                 this.kimenetel = kimenetel;
  194.                 this.sorszam = sorszam;
  195.             }
  196.         }
  197.         public static List<Eredmenyek> lehetsegesEredmenyek = new List<Eredmenyek>();
  198.  
  199.         public class Minimax
  200.         {
  201.             public int letezik = 1;
  202.             public int eredmeny;
  203.             public List<int> lepesek = new List<int>();
  204.  
  205.             public Minimax(int eredmeny, List<int> lepesek)
  206.             {
  207.                 this.eredmeny = eredmeny;
  208.                 this.lepesek = lepesek;
  209.             }
  210.         }
  211.  
  212.  
  213.         static void multiPlayer(List<Csucs> lista, int player)
  214.         {
  215.             /* Ha a listában szerepel törölhető elem, akkor elem törlése*/
  216.             if (lista.Where(x => x.letezik == 1).Count() != 1)
  217.             {
  218.                 for (int i = 1; i <= lista.Count(); i++)
  219.                 {
  220.  
  221.                     /* lokális lista másolat létrehozása*/
  222.                     List<Csucs> listacopy = new List<Csucs>();
  223.                     if (true)
  224.                     {
  225.                         foreach (Csucs csucs in lista.Where(x => x.letezik == 1))
  226.                         {
  227.                             listacopy.Add(new Csucs(csucs.szulosorszam, csucs.sorszam, csucs.nev));
  228.                             foreach (var item in csucs.gyerekekInt)
  229.                                 listacopy.Find(x => x.sorszam == csucs.sorszam).gyerekekInt.Add(item);
  230.                             foreach (var item in csucs.gyerekekString)
  231.                                 listacopy.Find(x => x.sorszam == csucs.sorszam).gyerekekString = csucs.gyerekekString;
  232.                             listacopy.Find(x => x.sorszam == csucs.sorszam).letezik = csucs.letezik;
  233.                         }
  234.                     }
  235.  
  236.                     /* ha az adott csúcsnak nincs gyereke, akkor nem lehet választani (min 1 gyereket törölni kell) → skip */
  237.                     int sorszam = i;
  238.                     if (listacopy.Where(x => x.sorszam == sorszam).Count() == 0)
  239.                             continue;
  240.                     else if(listacopy.Find(x => x.sorszam == sorszam).letezik != 1 || listacopy.Find(x => x.sorszam == sorszam).gyerekekInt.Count == 0)
  241.                             continue;
  242.  
  243.                     /* ha törölni kell */
  244.                     else
  245.                     {
  246.                         Csucs szulo = listacopy.Find(x => x.sorszam == sorszam);
  247.  
  248.                         // unoka.szulosorszam updateje  
  249.                         List<int> gyerekek = new List<int>();
  250.                         foreach (Csucs gyerek in listacopy.Where(x => x.szulosorszam == sorszam))
  251.                             foreach (int unoka in gyerek.gyerekekInt)
  252.                                 gyerekek.Add(unoka);
  253.                         foreach (Csucs item in listacopy)
  254.                             if (gyerekek.Contains(item.sorszam) && item.letezik == 1)
  255.                                 item.szulosorszam = sorszam;
  256.  
  257.                         // szülő gyerekeinek logikai törlése
  258.                         foreach (int item in szulo.gyerekekInt)
  259.                         {
  260.                             foreach (var item2 in listacopy)
  261.                             {
  262.                                 if (item2.sorszam == item)
  263.                                 {
  264.                                     listacopy.Find(x => x == item2).letezik = 0;
  265.                                     listacopy.Find(x => x == item2).gyerekekInt.Clear();
  266.                                     listacopy.Find(x => x == item2).gyerekekString.Clear();
  267.                                 }
  268.                             }
  269.                         }
  270.  
  271.                         // szülő gyerekeinek updateje
  272.                         listacopy.Find(x => x.sorszam == sorszam).gyerekekInt.Clear();
  273.                         listacopy.Find(x => x.sorszam == sorszam).gyerekekString.Clear();
  274.                         foreach (Csucs item in listacopy)
  275.                         {
  276.                             if (item.szulosorszam == sorszam && item.letezik == 1)
  277.                             {
  278.                                 listacopy.Find(x => x.sorszam == sorszam).gyerekekInt.Add(item.sorszam);
  279.                                 listacopy.Find(x => x.sorszam == sorszam).gyerekekString.Add(item.nev);
  280.                             }
  281.                         }
  282.                         lehetsegesEredmenyek.Add(new Eredmenyek(0, szulo.sorszam));
  283.                     }
  284.  
  285.  
  286.  
  287.  
  288.                     /* törlés után az eljárás rekurzív újrahívása */
  289.                     if (player == 1)
  290.                         multiPlayer(listacopy, 2);
  291.                     if (player == 2)
  292.                         multiPlayer(listacopy, 1);
  293.                 }
  294.                
  295.             }
  296.  
  297.             /* Ha a listában csak 1 elem szerepel, akkor PLAYER szerint eredmény visszaadása */
  298.             else if (lista.Where(x => x.letezik == 1).Count() == 1 && player == 2) {
  299.                 lehetsegesEredmenyek.Add(new Eredmenyek(1, 0));
  300.             }
  301.             else
  302.                 lehetsegesEredmenyek.Add(new Eredmenyek(-1, 0));
  303.         }
  304.  
  305.  
  306.         static void minimaxToFa(List<Eredmenyek> fa, List<Minimax> minimax, List<Csucs> lista)
  307.         {
  308.             hibasTorol(minimax);
  309.  
  310.             int i, j;
  311.             foreach (Minimax kimenetelek in minimax)
  312.             {
  313.                 i = 0;
  314.                 j = 0;
  315.                 if (kimenetelek.letezik == 1)
  316.                 {
  317.                     foreach (int lepesek in kimenetelek.lepesek)
  318.                     {
  319.                         if (j + 1 == kimenetelek.lepesek.Count())
  320.                             fa.Add(new Eredmenyek(j, kimenetelek.eredmeny, lepesek));
  321.                         else
  322.                             fa.Add(new Eredmenyek(j, 0, lepesek));
  323.                         j++;
  324.                     }
  325.                 }
  326.                 j = 0;
  327.                 i++;
  328.             }
  329.  
  330.  
  331.             Console.WriteLine("###############\t   Fa\t##################");
  332.             foreach (var item in fa)
  333.             {
  334.                 Console.WriteLine(item.kimenetel + " " + item.sorszam + " " + item.szulo);
  335.                 if (item.kimenetel != 0) Console.WriteLine();
  336.             }
  337.             Console.WriteLine();
  338.         }
  339.  
  340.         static void hibasTorol(List<Minimax> minimax)                                   // 3 1 0      vs      3 1 1 0               and 2 1 0       vs      2 1 1 0
  341.         {
  342.             foreach (Minimax item1 in minimax)
  343.             {
  344.                 int index = minimax.IndexOf(item1);
  345.                 //Minimax temp = new Minimax(item1.eredmeny, item1.lepesek);
  346.                 int a = item1.lepesek.Count() - 1;
  347.                 foreach (var item2 in minimax)
  348.                 {
  349.                     int b = 0;
  350.  
  351.                     if (!item1.Equals(item2))
  352.                     {
  353.                         for (int i = 0; i < a; i++)
  354.                         {                                                                           // 2 1 0   vs  2 1 1 0    
  355.                             if (item1.lepesek.Count() < item2.lepesek.Count())                      // 3       <   4
  356.                                 if(item1.lepesek.ElementAt(i) == item2.lepesek.ElementAt(i))        
  357.                                     b++;
  358.                         }
  359.  
  360.                         if (a == b)
  361.                         {
  362.                             Console.WriteLine("torles");
  363.                             minimax.ElementAt(index).letezik = 0;
  364.                         }
  365.                     }
  366.                 }
  367.             }
  368.         }
  369.  
  370.         static void Main(string[] args)
  371.         {
  372.  
  373.             List<Csucs> lista = new List<Csucs>();
  374.             treeSetup(lista);
  375.  
  376.             kiirFullLista(lista);
  377.  
  378.             //singlePlayer(lista);
  379.  
  380.  
  381.             multiPlayer(lista, 1);
  382.             Console.WriteLine("###############\tCheck\t##################");
  383.             /*if (lehetsegesEredmenyek.First().kimenetel == 1)
  384.                 Console.WriteLine("win");
  385.  
  386.             else
  387.                 Console.WriteLine("lose");
  388.                 */
  389.             lehetsegesEredmenyek.ForEach(delegate (Eredmenyek a)
  390.             {
  391.                 Console.Write(" " + a.kimenetel);
  392.             });
  393.  
  394.             Console.WriteLine("\n\n##########################################");
  395.  
  396.  
  397.             List<Minimax> minimax = new List<Minimax>();
  398.             List<int> lepesekLocal = new List<int>();
  399.  
  400.             foreach (var item in lehetsegesEredmenyek)
  401.             {
  402.                 lepesekLocal.Add(item.sorszam);
  403.                 if (item.kimenetel != 0)
  404.                 {
  405.                     minimax.Add(new Minimax(item.kimenetel, lepesekLocal.ToList()));
  406.                     lepesekLocal.Clear();
  407.                 }
  408.             }
  409.  
  410.             Console.WriteLine("###############\tMinimax\t##################");
  411.             foreach (var item in minimax)
  412.             {
  413.                 if (item.letezik == 1)
  414.                 {
  415.                     Console.Write(item.eredmeny + "\t");
  416.                     item.lepesek.ForEach(delegate (int a) { Console.Write(" " + a); });
  417.                     Console.WriteLine();
  418.                 }
  419.             }
  420.             Console.WriteLine();
  421.  
  422.             List<Eredmenyek> fa = new List<Eredmenyek>();
  423.             minimaxToFa(fa, minimax, lista);
  424.  
  425.             //check(lista);
  426.  
  427.             Console.ReadKey();
  428. }
  429.     }
  430. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement