static void Main(string[] args) { //nacti vstup int sirka = Ctecka.PrectiInt(); int vyska = Ctecka.PrectiInt(); char znak; Dictionary <char, Seznam <Souradnice> > ht = new Dictionary <char, Seznam <Souradnice> >(); //Console.ReadLine(); for (int y = 0; y < vyska; y++) { for (int x = 0; x < sirka; x++) { //vkladam do ht seznamy -> pismeno : pozice Seznam <Souradnice> lss, nova = new Seznam <Souradnice>(new Souradnice(x, y), null); znak = (char)Console.Read(); if (ht.TryGetValue(znak, out lss)) { lss.Append(nova); } else { ht.Add(znak, nova); } } } Console.ReadLine(); String text = Console.ReadLine(); //Console.WriteLine (text); //hledej Souradnice start = new Souradnice(0, 0), cil; int delka = 0; for (int i = text.Length - 1; i >= 0; i--) { int prac = NajdiMin(text[i], start, out cil, ht); if (prac != -1) { delka += prac + 1; start = cil; } } //vypis vystup Console.WriteLine(delka); }
//najde minimalni pocet kroku na ceste k zadanemu pismenu ze zadanych souradnic; //souradnici pismene vraci v parametru static int NajdiMin(char pismeno, Souradnice odkud, out Souradnice kam, Dictionary <char, Seznam <Souradnice> > tabulka) { kam = odkud; Seznam <Souradnice> seznam = null; if (tabulka.TryGetValue(pismeno, out seznam)) { Souradnice s = seznam.Value; if (s != null) { int min = odkud.vzdalenost(s); kam = s; while (seznam.Next != null) { seznam = seznam.Next; s = seznam.Value; if (s != null) { int vzd = odkud.vzdalenost(s); if (vzd < min) { kam = s; min = vzd; } } } return(min); } else { kam = null; return(-1); } } else { kam = null; return(-1); } }
public int vzdalenost(Souradnice b) { return(Math.Abs(this.X - b.X) + Math.Abs(this.Y - b.Y)); }