Advertisement
Guest User

Untitled

a guest
Mar 24th, 2019
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.86 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 ConsoleApp7
  8. {
  9. class Program
  10. {
  11. class Ctecka
  12. {
  13. /// <summary>
  14. /// precita int zo vstupu
  15. /// </summary>
  16. /// <returns></returns>
  17. public static int PrectiInt()
  18. {
  19. int znak = Console.Read();
  20. while (((znak < '0') || (znak > '9')) & (znak != '-'))
  21. znak = Console.Read();
  22.  
  23. bool minus = false;
  24. if (znak == '-')
  25. {
  26. minus = true;
  27. znak = Console.Read();
  28. }
  29.  
  30. int x = 0;
  31. while ((znak >= '0') && (znak <= '9'))
  32. {
  33. x = 10 * x + znak - '0';
  34. znak = Console.Read();
  35. }
  36. if (minus)
  37. x = x * -1;
  38. return x;
  39. }
  40. }
  41. class StavAKroky
  42. {
  43. public int[] stav = new int[3];
  44. public int kroky;
  45. public StavAKroky(int[] s, int kroky)
  46. {
  47. this.stav = s;
  48. this.kroky = kroky;
  49. }
  50. public StavAKroky(int a, int b, int c, int kroky)
  51. {
  52. this.stav[0] = a;
  53. this.stav[1] = b;
  54. this.stav[2] = c;
  55. this.kroky = kroky;
  56. }
  57. }
  58. class Stavy
  59. {
  60. bool[,] pamat; //staci dvojrozmerne lebo objem dvoch nadob definuje stav jednoznacne ... kedze celkovy objem vody sa nemeni
  61. public Stavy(int a, int b)
  62. {
  63. this.pamat = new bool[a+1, b+1];
  64. }
  65. public List<int[]> VratDalsieStavy(int[] s, int[] max)
  66. {
  67. List<int[]> stavy = new List<int[]>();
  68. for (int odkial = 0; odkial < 3; odkial++)
  69. for (int kam = 0; kam < 3; kam++)
  70. if (odkial != kam)
  71. { //prelievam z i do j
  72. int[] pom = new int[3];
  73. for (int k = 0; k < 3; k++)
  74. {
  75. pom[k] = s[k];
  76. }
  77. if (s[odkial] <= max[kam] - s[kam])
  78. {
  79. pom[odkial] = 0;
  80. pom[kam] = s[kam] + s[odkial];
  81. }
  82. else
  83. {
  84. pom[kam] = max[kam];
  85. pom[odkial] = s[odkial] - max[kam] + s[kam];
  86. }
  87. stavy.Add(pom);
  88. }
  89. return stavy;
  90. }
  91. public void pridajKPreskumanym(int[] s)
  92. {
  93. pamat[s[0], s[1]] = true;
  94. }
  95. public bool jeNepreskumany(int[] s)
  96. {
  97. if (pamat[s[0], s[1]])
  98. return false;
  99. else
  100. return true;
  101. }
  102. }
  103. class Objemy
  104. {
  105. int[] objemy;
  106. int size;
  107. int max;
  108. public bool mamVsetky;
  109. public Objemy(int a)
  110. {
  111. this.objemy = new int[a+1];
  112. this.size = a + 1;
  113. this.max = a + 2;
  114. this.mamVsetky = false;
  115. for (int i = 0; i < a+1; i++)
  116. {
  117. this.objemy[i] = this.max;
  118. }
  119. }
  120. public void pridaj(StavAKroky s)
  121. {
  122. for (int i = 0; i < 3; i++)
  123. if (objemy[s.stav[i]] > s.kroky)
  124. {
  125. objemy[s.stav[i]] = s.kroky;
  126. if (MamVsetkyObjemy()) mamVsetky = true;
  127. }
  128. }
  129. private bool MamVsetkyObjemy()
  130. {
  131. for (int i = 0; i < size; i++)
  132. if (objemy[i] == max)
  133. return false;
  134. return true;
  135. }
  136. public void vypis()
  137. {
  138. for (int i = 0; i < size; i++)
  139. {
  140. if(objemy[i]!=max)
  141. Console.Write(i+":"+objemy[i]+" ");
  142. }
  143. }
  144. }
  145.  
  146. static void Main(string[] args)
  147. {
  148. StavAKroky max = new StavAKroky(Ctecka.PrectiInt(), Ctecka.PrectiInt(), Ctecka.PrectiInt(), 0); // konstruktory
  149. StavAKroky start = new StavAKroky(Ctecka.PrectiInt(), Ctecka.PrectiInt(), Ctecka.PrectiInt(), 0);
  150.  
  151. Objemy objemy = new Objemy(Math.Max(Math.Max(max.stav[0], max.stav[1]), max.stav[2])); // najvacsi objem z max objemov
  152. Stavy stavy = new Stavy(max.stav[0], max.stav[1]);
  153. Queue<StavAKroky> rad = new Queue<StavAKroky>();
  154.  
  155. List<int[]> zoznam;
  156. StavAKroky aktualny;
  157. StavAKroky pom;
  158. rad.Enqueue(start);
  159.  
  160. while (rad.Count != 0 && !objemy.mamVsetky)
  161. {
  162. aktualny = rad.Dequeue();
  163. objemy.pridaj(aktualny);
  164. stavy.pridajKPreskumanym(aktualny.stav);
  165. zoznam = stavy.VratDalsieStavy(aktualny.stav, max.stav);
  166. foreach (int[] s in zoznam)
  167. if (stavy.jeNepreskumany(s))
  168. {
  169. pom = new StavAKroky(s, aktualny.kroky+1);
  170. rad.Enqueue(pom);
  171. }
  172. }
  173. objemy.vypis();
  174. }
  175. }
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement