csaki

Mestint ZH feladat (Kusper csop.) - Szerzetes/ÉhesHuszár

Mar 26th, 2014
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 12.66 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace mestint_zh_mkrisztian
  7. {
  8.     // Absztrakt osztályok
  9.     abstract class AbsztraktOperátor
  10.     {
  11.         public abstract AbsztraktÁllapot Op(AbsztraktÁllapot a);
  12.     }
  13.  
  14.     abstract class AbsztraktÁllapot
  15.     {
  16.         public List<AbsztraktOperátor> operátorok = new List<AbsztraktOperátor>();
  17.         public abstract bool ÁllapotE();
  18.         public abstract bool CélÁllapotE();
  19.         public abstract int OperátorokSzáma();
  20.         public abstract AbsztraktÁllapot SzuperOperátor(int i);
  21.         protected virtual object Clone() { return MemberwiseClone(); }
  22.         public override bool Equals(Object a) { return false; }
  23.         public override int GetHashCode() { return base.GetHashCode(); }
  24.     }
  25.  
  26.     class ÉhesOperátor : AbsztraktOperátor
  27.     {
  28.         int x, y;
  29.         public ÉhesOperátor(int x, int y)
  30.         {
  31.             this.x = x;
  32.             this.y = y;
  33.         }
  34.         public override AbsztraktÁllapot Op(AbsztraktÁllapot a)
  35.         {
  36.             ÉhesHuszárÁllapot új = a as ÉhesHuszárÁllapot;
  37.             return új.lóLépés(x, y);
  38.         }
  39.     }
  40.  
  41.     class SzerzetesOperátor : AbsztraktOperátor
  42.     {
  43.         int sz, k;
  44.         public SzerzetesOperátor(int sz, int k)
  45.         {
  46.             this.sz = sz;
  47.             this.k = k;
  48.         }
  49.         public override AbsztraktÁllapot Op(AbsztraktÁllapot a)
  50.         {
  51.             SzerzetesekÉsKannibálokÁllapot új = a as SzerzetesekÉsKannibálokÁllapot;
  52.             return új.hajókázás(sz, k);
  53.         }
  54.     }
  55.  
  56.     class Csúcs
  57.     {
  58.         AbsztraktÁllapot állapot;
  59.         int mélység;
  60.         Csúcs szülő;
  61.         public Csúcs(AbsztraktÁllapot kezdőÁllapot)
  62.         {
  63.             állapot = kezdőÁllapot;
  64.             mélység = 0;
  65.             szülő = null;
  66.         }
  67.         public Csúcs(AbsztraktÁllapot állapot, int mélység, Csúcs szülő)
  68.         {
  69.             this.állapot = állapot;
  70.             this.mélység = mélység;
  71.             this.szülő = szülő;
  72.         }
  73.         public Csúcs GetSzülő() { return szülő; }
  74.         public int GetMélység() { return mélység; }
  75.         public bool TerminálisCsúcsE() { return állapot.CélÁllapotE(); }
  76.         public int OperátorokSzáma() { return állapot.OperátorokSzáma(); }
  77.         public Csúcs SzuperOperátor(int i)
  78.         {
  79.             AbsztraktÁllapot új = állapot.SzuperOperátor(i);
  80.             if (új != null) return new Csúcs(új, mélység + 1, this);
  81.             return null;
  82.         }
  83.         public override bool Equals(Object obj)
  84.         {
  85.             Csúcs cs = (Csúcs)obj;
  86.             return állapot.Equals(cs.állapot);
  87.         }
  88.         public override int GetHashCode() { return állapot.GetHashCode(); }
  89.         public override String ToString() { return állapot.ToString(); }
  90.  
  91.     }
  92.  
  93.     abstract class GráfKereső
  94.     {
  95.         private Csúcs startCsúcs;
  96.         public GráfKereső(Csúcs startCsúcs)
  97.         {
  98.             this.startCsúcs = startCsúcs;
  99.         }
  100.         protected Csúcs GetStartCsúcs() { return startCsúcs; }
  101.         public abstract Csúcs Keresés();
  102.         public void megoldásKiírása(Csúcs egyTerminálisCsúcs)
  103.         {
  104.             if (egyTerminálisCsúcs == null)
  105.             {
  106.                 Console.WriteLine("Nincs megoldás");
  107.                 return;
  108.             }
  109.             Stack<Csúcs> megoldás = new Stack<Csúcs>();
  110.             Csúcs aktCsúcs = egyTerminálisCsúcs;
  111.             while (aktCsúcs != null)
  112.             {
  113.                 megoldás.Push(aktCsúcs);
  114.                 aktCsúcs = aktCsúcs.GetSzülő();
  115.             }
  116.             foreach (Csúcs akt in megoldás) Console.WriteLine(akt);
  117.         }
  118.     }
  119.  
  120.     class BackTrack : GráfKereső
  121.     {
  122.         int korlát;
  123.         bool emlékezetes;
  124.         public BackTrack(Csúcs startCsúcs, int korlát, bool emlékezetes)
  125.             : base(startCsúcs)
  126.         {
  127.             this.korlát = korlát;
  128.             this.emlékezetes = emlékezetes;
  129.         }
  130.         public BackTrack(Csúcs startCsúcs) : this(startCsúcs, 0, false) { }
  131.         public BackTrack(Csúcs startCsúcs, int korlát) : this(startCsúcs, korlát, false) { }
  132.         public BackTrack(Csúcs startCsúcs, bool emlékezetes) : this(startCsúcs, 0, emlékezetes) { }
  133.         public override Csúcs Keresés() { return Keresés(GetStartCsúcs()); }
  134.  
  135.         private Csúcs Keresés(Csúcs aktCsúcs)
  136.         {
  137.             int mélység = aktCsúcs.GetMélység();
  138.             if (korlát > 0 && mélység >= korlát) return null;
  139.             Csúcs aktSzülő = null;
  140.             if (emlékezetes) aktSzülő = aktCsúcs.GetSzülő();
  141.             while (aktSzülő != null)
  142.             {
  143.                 if (aktCsúcs.Equals(aktSzülő)) return null;
  144.                 aktSzülő = aktSzülő.GetSzülő();
  145.             }
  146.             if (aktCsúcs.TerminálisCsúcsE())
  147.             {
  148.                 return aktCsúcs;
  149.             }
  150.             for (int i = 0; i < aktCsúcs.OperátorokSzáma(); i++)
  151.             {
  152.                 Csúcs újCsúcs = aktCsúcs.SzuperOperátor(i);
  153.                 if (újCsúcs != null)
  154.                 {
  155.                     Csúcs terminális = Keresés(újCsúcs);
  156.                     if (terminális != null)
  157.                     {
  158.                         return terminális;
  159.                     }
  160.                 }
  161.             }
  162.             return null;
  163.         }
  164.     }
  165.  
  166.     class ÉhesHuszárÁllapot : AbsztraktÁllapot
  167.     {
  168.         static int N = 3;
  169.         int x, y;
  170.         public ÉhesHuszárÁllapot()
  171.         {
  172.             x = 2;
  173.             y = 2;
  174.             for (int i = -2; i <= 2; i++)
  175.             {
  176.                 for (int j = -2; j <= 2; j++)
  177.                 {
  178.                     if (i == 0 || j == 0) continue;
  179.                     if (preLóLépés(i, j)) operátorok.Add(new ÉhesOperátor(i, j));
  180.                 }
  181.             }
  182.         }
  183.         public ÉhesHuszárÁllapot(int n)
  184.             : this()
  185.         {
  186.             N = n;
  187.         }
  188.         public override bool CélÁllapotE()
  189.         {
  190.             return x == N + 1 && y == N + 1;
  191.         }
  192.         public override bool ÁllapotE()
  193.         {
  194.             return x >= 2 && y >= 2 && x <= N + 1 && y <= N + 1;
  195.         }
  196.         private bool preLóLépés(int x, int y)
  197.         {
  198.             if (!(x * y == 2 || x * y == -2)) return false;
  199.             return true;
  200.         }
  201.         public AbsztraktÁllapot lóLépés(int x, int y)
  202.         {
  203.             if (!preLóLépés(x, y)) return null;
  204.             ÉhesHuszárÁllapot új = (ÉhesHuszárÁllapot)this.Clone();
  205.             új.x += x;
  206.             új.y += y;
  207.             if (új.ÁllapotE()) return új;
  208.             return null;
  209.         }
  210.         public override AbsztraktÁllapot SzuperOperátor(int i)
  211.         {
  212.             return operátorok[i].Op(this);
  213.  
  214.             //switch (i)
  215.             //{
  216.             //    case 0: return lóLépés(1, 2);
  217.             //    case 1: return lóLépés(1, -2);
  218.             //    case 2: return lóLépés(-1, 2);
  219.             //    case 3: return lóLépés(-1, -2);
  220.             //    case 4: return lóLépés(2, 1);
  221.             //    case 5: return lóLépés(2, -1);
  222.             //    case 6: return lóLépés(-2, 1);
  223.             //    case 7: return lóLépés(-2, -1);
  224.             //    default: return null;
  225.             //}
  226.         }
  227.         public override int OperátorokSzáma() { return operátorok.Count; }
  228.         public override string ToString() { return (x - 2) + " : " + (y - 2); }
  229.         public override bool Equals(Object a)
  230.         {
  231.             ÉhesHuszárÁllapot aa = (ÉhesHuszárÁllapot)a;
  232.             return aa.x == x && aa.y == y;
  233.         }
  234.         public override int GetHashCode()
  235.         {
  236.             return x.GetHashCode() + y.GetHashCode();
  237.         }
  238.     }
  239.  
  240.     class SzerzetesekÉsKannibálokÁllapot : AbsztraktÁllapot
  241.     {
  242.         int szerzetesekSzáma; // ennyi szerzetes van összesen
  243.         int kannibálokSzáma; // ennyi kannibál van összesen
  244.         int szerzetesekBalOldal; // szerzetesek száma a bal oldalon
  245.         int kannibálokBalOldal; // kannibálok száma a bal oldalon
  246.         char csonakMelyikOldalon; // Hol a csónak? Értéke vagy 'B' vagy 'J'.
  247.         int szerzetesekJobbOldal; // szerzetesek száma a jobb oldalon
  248.         int kannibálokJobbOldal; // kannibálok száma a jobb oldalon
  249.  
  250.         public SzerzetesekÉsKannibálokÁllapot(int sz, int k)
  251.         {
  252.             this.szerzetesekSzáma = sz;
  253.             this.kannibálokSzáma = k;
  254.             szerzetesekBalOldal = sz;
  255.             kannibálokBalOldal = k;
  256.             csonakMelyikOldalon = 'B';
  257.             szerzetesekJobbOldal = 0;
  258.             kannibálokJobbOldal = 0;
  259.  
  260.             if (preOp(0, 1)) operátorok.Add(new SzerzetesOperátor(0, 1));
  261.             if (preOp(0, 2)) operátorok.Add(new SzerzetesOperátor(0, 2));
  262.             if (preOp(1, 1)) operátorok.Add(new SzerzetesOperátor(1, 1));
  263.             if (preOp(2, 0)) operátorok.Add(new SzerzetesOperátor(2, 0));
  264.             if (preOp(1, 0)) operátorok.Add(new SzerzetesOperátor(1, 0));
  265.         }
  266.  
  267.         public override bool ÁllapotE()
  268.         {
  269.             return ((szerzetesekBalOldal >= kannibálokBalOldal) || (szerzetesekBalOldal == 0)) &&
  270.             ((szerzetesekJobbOldal >= kannibálokJobbOldal) || (szerzetesekJobbOldal == 0));
  271.         }
  272.         public override bool CélÁllapotE()
  273.         {
  274.             return szerzetesekJobbOldal == szerzetesekSzáma && kannibálokJobbOldal == kannibálokSzáma;
  275.         }
  276.  
  277.         private bool preOp(int szerz, int kann)
  278.         {
  279.             if (szerz + kann > 2 || szerz + kann < 0 || szerz < 0 || kann < 0) return false;
  280.             if (csonakMelyikOldalon == 'B')
  281.                 return szerzetesekBalOldal >= szerz && kannibálokBalOldal >= kann;
  282.             else
  283.                 return szerzetesekJobbOldal >= szerz && kannibálokJobbOldal >= kann;
  284.         }
  285.         public AbsztraktÁllapot hajókázás(int szerz, int kann)
  286.         {
  287.             if (!preOp(szerz, kann)) return null;
  288.             SzerzetesekÉsKannibálokÁllapot új = (SzerzetesekÉsKannibálokÁllapot)this.Clone();
  289.             if (új.csonakMelyikOldalon == 'B')
  290.             {
  291.                 új.szerzetesekBalOldal -= szerz;
  292.                 új.kannibálokBalOldal -= kann;
  293.                 új.csonakMelyikOldalon = 'J';
  294.                 új.szerzetesekJobbOldal += szerz;
  295.                 új.kannibálokJobbOldal += kann;
  296.             }
  297.             else
  298.             {
  299.                 új.szerzetesekBalOldal += szerz;
  300.                 új.kannibálokBalOldal += kann;
  301.                 új.csonakMelyikOldalon = 'B';
  302.                 új.szerzetesekJobbOldal -= szerz;
  303.                 új.kannibálokJobbOldal -= kann;
  304.             }
  305.             if (új.ÁllapotE()) return új;
  306.             return null;
  307.         }
  308.         public override int OperátorokSzáma() { return operátorok.Count; }
  309.         public override AbsztraktÁllapot SzuperOperátor(int i)
  310.         {
  311.             return operátorok[i].Op(this);
  312.         }
  313.  
  314.         public override string ToString()
  315.         {
  316.             return szerzetesekBalOldal + "," + kannibálokBalOldal + "," + csonakMelyikOldalon + "," + szerzetesekJobbOldal + "," + kannibálokJobbOldal;
  317.         }
  318.  
  319.         public override bool Equals(Object a)
  320.         {
  321.             SzerzetesekÉsKannibálokÁllapot aa = (SzerzetesekÉsKannibálokÁllapot)a;
  322.             return aa.szerzetesekBalOldal == szerzetesekBalOldal && aa.kannibálokBalOldal == kannibálokBalOldal && aa.csonakMelyikOldalon == csonakMelyikOldalon;
  323.         }
  324.         public override int GetHashCode()
  325.         {
  326.             return szerzetesekBalOldal.GetHashCode() + kannibálokBalOldal.GetHashCode() + csonakMelyikOldalon.GetHashCode();
  327.         }
  328.     }
  329.  
  330.     class Program
  331.     {
  332.         static void Main(string[] args)
  333.         {
  334.             Csúcs startCsúcs;
  335.             GráfKereső kereső;
  336.             Console.WriteLine("Szerzetesek és kannibálok probléma:");
  337.             startCsúcs = new Csúcs(new SzerzetesekÉsKannibálokÁllapot(3, 3));
  338.             kereső = new BackTrack(startCsúcs, 12, true);
  339.             kereső.megoldásKiírása(kereső.Keresés());
  340.             Console.WriteLine("\nÉheshuszár probléma:");
  341.             startCsúcs = new Csúcs(new ÉhesHuszárÁllapot(8));
  342.             kereső = new BackTrack(startCsúcs, 10, true);
  343.             kereső.megoldásKiírása(kereső.Keresés());
  344.             Console.ReadLine();
  345.         }
  346.     }
  347. }
Advertisement
Add Comment
Please, Sign In to add comment