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 ConsoleApp7
- {
- class Program
- {
- class Ctecka
- {
- /// <summary>
- /// precita int zo vstupu
- /// </summary>
- /// <returns></returns>
- public static int PrectiInt()
- {
- int znak = Console.Read();
- while (((znak < '0') || (znak > '9')) & (znak != '-'))
- znak = Console.Read();
- bool minus = false;
- if (znak == '-')
- {
- minus = true;
- znak = Console.Read();
- }
- int x = 0;
- while ((znak >= '0') && (znak <= '9'))
- {
- x = 10 * x + znak - '0';
- znak = Console.Read();
- }
- if (minus)
- x = x * -1;
- return x;
- }
- }
- class StavAKroky
- {
- public int[] stav = new int[3];
- public int kroky;
- public StavAKroky(int[] s, int kroky)
- {
- this.stav = s;
- this.kroky = kroky;
- }
- public StavAKroky(int a, int b, int c, int kroky)
- {
- this.stav[0] = a;
- this.stav[1] = b;
- this.stav[2] = c;
- this.kroky = kroky;
- }
- }
- class Stavy
- {
- bool[,] pamat; //staci dvojrozmerne lebo objem dvoch nadob definuje stav jednoznacne ... kedze celkovy objem vody sa nemeni
- public Stavy(int a, int b)
- {
- this.pamat = new bool[a+1, b+1];
- }
- public List<int[]> VratDalsieStavy(int[] s, int[] max)
- {
- List<int[]> stavy = new List<int[]>();
- for (int odkial = 0; odkial < 3; odkial++)
- for (int kam = 0; kam < 3; kam++)
- if (odkial != kam)
- { //prelievam z i do j
- int[] pom = new int[3];
- for (int k = 0; k < 3; k++)
- {
- pom[k] = s[k];
- }
- if (s[odkial] <= max[kam] - s[kam])
- {
- pom[odkial] = 0;
- pom[kam] = s[kam] + s[odkial];
- }
- else
- {
- pom[kam] = max[kam];
- pom[odkial] = s[odkial] - max[kam] + s[kam];
- }
- stavy.Add(pom);
- }
- return stavy;
- }
- public void pridajKPreskumanym(int[] s)
- {
- pamat[s[0], s[1]] = true;
- }
- public bool jeNepreskumany(int[] s)
- {
- if (pamat[s[0], s[1]])
- return false;
- else
- return true;
- }
- }
- class Objemy
- {
- int[] objemy;
- int size;
- int max;
- public bool mamVsetky;
- public Objemy(int a)
- {
- this.objemy = new int[a+1];
- this.size = a + 1;
- this.max = a + 2;
- this.mamVsetky = false;
- for (int i = 0; i < a+1; i++)
- {
- this.objemy[i] = this.max;
- }
- }
- public void pridaj(StavAKroky s)
- {
- for (int i = 0; i < 3; i++)
- if (objemy[s.stav[i]] > s.kroky)
- {
- objemy[s.stav[i]] = s.kroky;
- if (MamVsetkyObjemy()) mamVsetky = true;
- }
- }
- private bool MamVsetkyObjemy()
- {
- for (int i = 0; i < size; i++)
- if (objemy[i] == max)
- return false;
- return true;
- }
- public void vypis()
- {
- for (int i = 0; i < size; i++)
- {
- if(objemy[i]!=max)
- Console.Write(i+":"+objemy[i]+" ");
- }
- }
- }
- static void Main(string[] args)
- {
- StavAKroky max = new StavAKroky(Ctecka.PrectiInt(), Ctecka.PrectiInt(), Ctecka.PrectiInt(), 0); // konstruktory
- StavAKroky start = new StavAKroky(Ctecka.PrectiInt(), Ctecka.PrectiInt(), Ctecka.PrectiInt(), 0);
- Objemy objemy = new Objemy(Math.Max(Math.Max(max.stav[0], max.stav[1]), max.stav[2])); // najvacsi objem z max objemov
- Stavy stavy = new Stavy(max.stav[0], max.stav[1]);
- Queue<StavAKroky> rad = new Queue<StavAKroky>();
- List<int[]> zoznam;
- StavAKroky aktualny;
- StavAKroky pom;
- rad.Enqueue(start);
- while (rad.Count != 0 && !objemy.mamVsetky)
- {
- aktualny = rad.Dequeue();
- objemy.pridaj(aktualny);
- stavy.pridajKPreskumanym(aktualny.stav);
- zoznam = stavy.VratDalsieStavy(aktualny.stav, max.stav);
- foreach (int[] s in zoznam)
- if (stavy.jeNepreskumany(s))
- {
- pom = new StavAKroky(s, aktualny.kroky+1);
- rad.Enqueue(pom);
- }
- }
- objemy.vypis();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement