#include #include #include // Kuba Pelc using namespace std; #define ZED '#' #define VOLNO '.' #define START 'S' #define OBJEVENO 'O' #define OHEN 'F' #define EXIT 'E' struct point { int X, Y; point() { X = 0; Y = 0; } point(int x, int y) { X = x; Y = y; } }; int vyska, sirka; char *mapa; // Pomocné funkce pro čtení a zápis mapy char Get(int x, int y) { // Vrátí ZED pokud jsou souřadnice mimo rozsah mapy if(x < 0 || y < 0 || x >= sirka || y >= vyska) return ZED; // Dvojrozměrnou mapu reprezentujeme v jednorozměrném poli tak, // že jsou řádky zapsány postupně za sebe return mapa[x + y * sirka]; } void Set(int x, int y, char v) { mapa[x + y * sirka] = v; } int main() { cin >> vyska; cin >> sirka; mapa = new char[vyska * sirka]; string line; vector *slupkaOhen = new vector(); vector *slupkaOhenNova = new vector(); vector *slupkaOsoba = new vector(); vector *slupkaOsobaNova = new vector(); getline(cin, line); for(int y = 0; y < vyska; y++) { getline(cin, line); for(int x = 0; x < sirka; x++) { char c = line[x]; Set(x, y, c); if(c == OHEN) { slupkaOhen->push_back(point(x, y)); } if(c == START) { slupkaOsoba->push_back(point(x, y)); Set(x, y, OBJEVENO); } } } // Takto si vypíšeme možné sousedy políčka, které projdeme for smyčkou, // abychom nemuseli psát čtyřikrát stejný kód pro jednotlivé sousedy point sousede[4]; sousede[0] = point(-1, 0); sousede[1] = point(1, 0); sousede[2] = point(0, -1); sousede[3] = point(0, 1); int tah = 1; // V hlavní smyčce simulujeme oheň a hledáme cestu while(slupkaOsoba->size() > 0) { // Nejdříve se pohne osoba for(int i = 0; i < slupkaOsoba->size(); i++) { point p = (*slupkaOsoba)[i]; // Pokud políčko začalo hořet, zahodíme jej if(Get(p.X, p.Y) == OHEN) continue; for(int s = 0; s < 4; s++) { // Spočítáme opravdové souřadnice souseda point soused = point(p.X + sousede[s].X, p.Y + sousede[s].Y); char c = Get(soused.X, soused.Y); if(c == EXIT) { // Nalezli jsme východ, vypíšeme, kolik tahů nám to trvalo // a ukončíme program cout << tah << endl; return 0; } if(c == VOLNO) { slupkaOsobaNova->push_back(soused); // Označíme si, že cestu do tohoto souseda jsme již // objevili, takže se do něj už nikdy nemusíme vracet Set(soused.X, soused.Y, OBJEVENO); } } } // Simulujeme oheň for(int i = 0; i < slupkaOhen->size(); i++) { point p = (*slupkaOhen)[i]; for(int s = 0; s < 4; s++) { point soused = point(p.X + sousede[s].X, p.Y + sousede[s].Y); char c = Get(soused.X, soused.Y); if(c != ZED && c != OHEN) { // Políčko je volné a ještě nehoří, takže se sem // oheň rozšíří slupkaOhenNova->push_back(soused); Set(soused.X, soused.Y, OHEN); } } } // Prohodíme seznam aktuální slupky s novou vector *temp; temp = slupkaOhen; slupkaOhen = slupkaOhenNova; slupkaOhenNova = temp; temp = slupkaOsoba; slupkaOsoba = slupkaOsobaNova; slupkaOsobaNova = temp; slupkaOhenNova->clear(); slupkaOsobaNova->clear(); tah++; } // Doteď jsme program neukončili, takže jsme nenašli cestu do východu // a navíc už nemáme kam dál v hledání cesty pokračovat, protože skončila // hlavní smyčka, takže žádná cesta do východu neexistuje cout << "GAME OVER" << endl; return 0; }