/* © MATTO MATTI 2019 http://mattomatti.com/pl/a0206 napisane przy użyciu Visual Studio Community 2015 2019-02-02 v 1.0 */ using System; using System.Collections.Generic; namespace pltask1cs { class Program { struct Operacja { public char znak; public int wartosc; public Operacja(char znak, int wartosc) { this.znak = znak; this.wartosc = wartosc; } } struct Krok { public int liczba; public int poziom; public List historia; public Krok(int liczba, int poziom = 0, List historia = null) { this.liczba = liczba; this.poziom = poziom; this.historia = new List(); if (historia != null) { foreach(Operacja op in historia) { this.historia.Add(op); } } } } static int wykonajOperacje(int liczba, Operacja op) { switch (op.znak) { case '+': return liczba + op.wartosc; case '-': return liczba - op.wartosc; case '*': return liczba * op.wartosc; case '/': if (liczba % op.wartosc == 0) return liczba / op.wartosc; break; } return liczba; } static string wypiszHistorie(int x, List historia) { string s = x.ToString(); char poprz = '\0'; foreach (Operacja op in historia) { if ((op.znak == '*' || op.znak == '/') && (poprz == '+' || poprz == '-')) s = "(" + s + ")"; s += op.znak + op.wartosc.ToString(); poprz = op.znak; } return s; } static int ileOperacji(int x, int y, List operacje, int min = 0, int max = 100000) { List poprz = new List(); Queue kolejka = new Queue(); Krok teraz = new Krok(x); kolejka.Enqueue(teraz); while (kolejka.Count > 0) { teraz = kolejka.Dequeue(); if (teraz.liczba == y) { Console.WriteLine(wypiszHistorie(x, teraz.historia)); return teraz.poziom; } for (int i = 0; i < operacje.Count; i++) { int nowa = wykonajOperacje(teraz.liczba, operacje[i]); bool dodaj = poprz.IndexOf(nowa) == -1; if (dodaj && nowa >= min && min <= max) { poprz.Add(nowa); Krok kolejny = new Krok(nowa, teraz.poziom + 1, teraz.historia); kolejny.historia.Add(operacje[i]); kolejka.Enqueue(kolejny); } } } return -1; } static void Main(string[] args) { Console.Write("Podaj początkową wartość\n x = "); int x = Convert.ToInt32(Console.ReadLine()); Console.Write("Podaj wartość do uzyskania\n y = "); int y = Convert.ToInt32(Console.ReadLine()); Console.Write("Ile jest możliwych operacji\n n = "); int n = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Podaj je (operacja liczba):"); List operacje = new List(); while (n > 0) { string[] data = Console.ReadLine().Split(' '); char znak = data[0][0]; int wartosc = Convert.ToInt32(data[1]); Operacja op = new Operacja(znak, wartosc); operacje.Add(op); n--; } int wynik = ileOperacji(x, y, operacje); if (wynik == -1) { Console.WriteLine("Nie można uzyskać {0}", y); } else { Console.WriteLine("Potrzebnych operacji: {0}", wynik); } Console.ReadKey(); } } }