B3 - Miniranje
Vremensko ograničenje | Memorijsko ograničenje |
---|---|
2000ms | 128MB |
Mali Danilo treba da se nađe sa svojim najboljim drugom, ali zbog silnih radova u gradu to mu predstavlja problem. Srećom, Danilo uvek nosi par mina sa sobom koje može da iskoristi da stigne do svog druga.
Stanje grada se može opisati matricom, gde je svako polje slobodno ili blokirano radovima. U svakom trenutku Danilo može da pređe sa polja na kom se nalazi na susedna slobodna polja, gde su susedna polja u matrici ona polja koja su neposredno iznad, ispod, levo ili desno od trenutnog polja.
Danilo sme da postavi minu samo na polje koje mu je dostižno. Nakon eksplozije prve mine, pod uslovom da mu je ostalo još mina, Danilo može da postavi sledeću minu na sva polja do koja su mu tada dostižna (moguće je da se skup dostižnih polja proširio nakon eksplozije prve mine).
Ali Danilo je zaboravio snagu svojih mina. Pomozite mu da nađe minimalnu snagu mina \(K\) koja mu je potrebna da bi stigao do svog druga.
Snaga mina određuje veličinu njene eksplozije. Mina snage \(K\) oslobađa sva polja u pravougaoniku veličine \((2K+1)*(2K+1)\), sa centrom u istom polju gde je mina postavljena.
Na primer, ako se postavi mina u sredini leve matrice snage \(K = 1\), polja koja je eksplozija obuhvatila su označena sa O
i ta polja će na dalje biti prohodna.
Nađi minimalnu potrebnu snagu mina, \(K\), da bi bilo moguće da Danilo postavi mine na neki način tako da stigne do svog druga.
Opis ulaza
U prvom redu nalaze se dva broja \(N\), koji predstavlja dužine stranice matrice, i \(M\), broj mina koji je Danilo poneo sa sobom. Narednih \(N\) redova predstavlja stanje grada.
Slobodna polja su označena karakterom .
, a blokirana polja sa X
. Danilo se nalazi na polju označenim sa A
, a njegov drug na polju označenim sa B
. Ta dva polja su slobodna.
Opis izlaza
Ispisati prirodan broj \(K\) koji predstavlja minimalnu jačinu mina potrebnu da Danilo stigne do njegovog druga. Ako nije potrebno koristiti mine uopšte, ispisati -1.
Primer 1
Ulaz
Izlaz
Primer 2
Ulaz
Izlaz
Objašnjenje primera
U prvom primeru, Danilo može da postavi minu na polje \((2,2)\) ili \((2,1)\) jačine \(K = 2\) da bi napravio put do svog druga.
U drugom primeru, Danilo može samo da stavi minu na svoju poziciju. Stanje matrice nakon prve eksplozije minom snage \(K = 3\) na polje \((1,1)\):
Sad Danilo jedino može da postavi svoju poslednju minu na polje \((4,4)\) da bi otvorio put do svog druga.
Ograničenja
- \(2 \leq N \leq 500\)
- \(1 \leq M \leq 2\)
Postoje tri podzadatka:
- Podzadatak 1 [31 poena]: \(M = 1\).
- Podzadatak 2 [32 poena]: \(N \leq 50\).
- Podzadatak 3 [37 poena]: Nema dodatnih ograničenja.
Napomena
Danilo i njegov drug su otporni na eksplozije.
Autor | Tekst i test primeri | Analiza rеšenja | Testiranje |
---|---|---|---|
Dušan Zdravković | Nenad Bauk | Dimitrije Erdeljan | Dušan Zdravković |
Analiza
Ako je minama snage \(K\) moguće doći do cilja, očito je moguće na isti način i sa snagom \(K+1\). Samim tim, minimalno \(K\) možemo naći binarnom pretragom "po rešenju". Za ovo nam je potreban algoritam kojim ćemo odrediti da li, za fiksno \(K\), možemo stići od polaznog do ciljnog polja.
Ako postavimo minu na neko polje i time oslobodimo kvadrat dimenzija \(2K+1 \times 2K+1\), nakon što izađemo iz tog kvadrata nema razloga da se vraćamo u njega (u suprotnom, možemo "preskočiti" deo puta od izlaska do povratka). Zbog ovoga, mine možemo posmatrati kao "teleport" uređaje, koji omogućavaju da se prebacimo na proizvoljno polje na rastojanju ne većem od \(K\) (koje može biti i zauzeto).
Dakle, naš put od polaznog do ciljnog polja će imati sledeći oblik:
- krećemo se slobodnim poljima do mesta gde postavljamo prvu minu,
- "preskočimo" na polje, možda zauzeto, na rastojanju ne većem od \(K\),
- dalje se krećemo slobodnim poljima do mesta za drugu minu,
- opet "preskočimo", i
- krećemo se do cilja slobodnim poljima.
Polja do kojih možemo stići u prvom koraku možemo naći pretragom u dubinu ili širinu od početnog polja. Zatim markiramo sva polja na rastojanju ne većem od \(K\) od nekog od pronađenih, i pokrenemo novu pretragu od svih markiranih polja (za treći korak). Ovu proceduru ponovimo još jednom za drugu minu i kretanje posle nje. Ako je na kraju ovaj algoritam našao put do cilja, moguće je doći do cilja sa minama snage \(K\).
Ukupna složenost jedne provere (za fiksno \(K\)) je \(\mathcal{O}(N^2)\) (tri pretrage i dva prolaska kroz matricu), a kako nam za binarnu pretragu treba \(\log{N}\) provera, složenost algoritma je \(\mathcal{O}(N^2 \log{N})\).
Smernice za algoritam
Pri implementaciji algoritma, treba voditi računa o koraku gde markiramo sva polja na rastojanju ne većem od \(K\) od skupa polja do kojih već imamo put. Ovo ne možemo raditi tako što za svako svakog polje do kog znamo put obeležimo njegovo okruženje, jer je složenost ovoga \(\mathcal{O}(N^2 K^2)\), tj. u najgorem slučaju (za \(K=N\)) \(\mathcal{O}(N^4)\).
Ovaj deo programa je moguće implementirati na više načina. Jedna mogućnost je da pokrenemo pretragu u širinu od svih polja do kojih imamo put (paralelno), koju prekidamo kada dođemo na rastojanje \(K\) (obratite pažnju da ova pretraga ne uzima u obzir "blokiranost" polja i da rastojanje moramo gledati odvojeno za vertikalno i horizontalno kretanje).
Druga mogućnost je da izračunamo matricu prefiksnih suma na matrici "da li imamo put do ovog polja" (gde polja imaju vrednost \(1\) ako imamo put do njih, a inače \(0\)). Pomoću ove matrice možemo u \(\mathcal{O}(1)\) odrediti koliko polja do kojih imamo put postoji u kvadratu \(2K+1 \times 2K+1\) centriranom na proizvoljnom polju, tj. da li je do njega moguće "skočiti".
03_miniranje.cpp | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
|