fbpx

Problema #2894 – Barlog – Rezolvari PBInfo

de Mihai-Alexandru

Este anul 2019, dar Zmeul-Cel-Rău și Făt-Frumos luptă în continuare. Zmeul l-a prins pe Făt-Frumos şi l-a închis în una dintre camerele bârlogului său. Un bârlog de zmeu are forma unui tablou bidimensional, în care camerele sunt plasate sub forma a n linii și m coloane. Vom numerota liniile de la 1 la n, iar coloanele de la 1 la m, astfel că fiecare cameră poate fi identificată prin numărul liniei și al coloanei pe care se află.

Orice cameră are patru pereți și câte o ușă pe fiecare perete prin care poate comunica cu camerele învecinate. Mai exact, camera de pe linia i și coloana j poate comunica cu camerele (i-1,j), (i,j+1), (i+1,j), (i,j-1) (desigur, dacă acestea există). Fiecare cameră are asociat un cod. Ușile din orice cameră se pot deschide cu o cartelă magnetică. Dacă codul camerei este un subșir al cuvântului memorat pe cartela magnetică, atunci ușile din camera respectivă se vor deschide folosind cartela. Ileana Cosânzeana a reușit să-i trimită lui Făt-Frumos o cartelă magnetică.

Cerința

Scrieți un program care rezolvă următoarele două cerințe:

Este anul 2019, dar Zmeul-Cel-Rău și Făt-Frumos luptă în continuare. Zmeul l-a prins pe Făt-Frumos şi l-a închis în una dintre camerele bârlogului său. Un bârlog de zmeu are forma unui tablou bidimensional, în care camerele sunt plasate sub forma a n linii și m coloane. Vom numerota liniile de la 1 la n, iar coloanele de la 1 la m, astfel că fiecare cameră poate fi identificată prin numărul liniei și al coloanei pe care se află.

Orice cameră are patru pereți și câte o ușă pe fiecare perete prin care poate comunica cu camerele învecinate. Mai exact, camera de pe linia i și coloana j poate comunica cu camerele (i-1,j), (i,j+1), (i+1,j), (i,j-1) (desigur, dacă acestea există). Fiecare cameră are asociat un cod. Ușile din orice cameră se pot deschide cu o cartelă magnetică. Dacă codul camerei este un subșir al cuvântului memorat pe cartela magnetică, atunci ușile din camera respectivă se vor deschide folosind cartela. Ileana Cosânzeana a reușit să-i trimită lui Făt-Frumos o cartelă magnetică.

Cerința

Scrieți un program care rezolvă următoarele două cerințe:
1. determină numărul de camere în care ar putea ajunge Făt-Frumos folosind cartela primită de la Ileana Cosânzeana;
2. determină numărul minim de camere prin care trece Făt-Frumos pentru a ieși din bârlogul zmeului (adică poate deschide ușa unei camere prin care ajunge în exteriorul bârlogului).

Date de intrare

Fișierul de intrare barlog.in conține pe prima linie cerința c care trebuie să fie rezolvată (1 sau 2). Pe a doua linie se află două numere naturale n m, reprezentând numărul de linii și respectiv numărul de coloane ale tabloului care reprezintă bârlogul zmeului. Pe următoarele n linii se află câte m cuvinte, reprezentând în ordine codurile de acces ale camerelor din bârlogul zmeului. Pe ultima linie sunt două numere naturale și un cuvânt lin col cuv, reprezentând linia și coloana camerei în care a fost închis Făt-Frumos, precum și cuvântul înscris pe cartela magnetică primită de Făt-Frumos de la Ileana Cosânzeana. Valorile scrise pe aceeași linie sunt separate prin câte-un spațiu.

Date de ieșire

Fișierul de ieșire barlog.out va conține o singură linie pe care va fi scris un număr natural determinat conform cerinței c.

Restricții și precizări

  • 2 ≤ n, m ≤ 100
  • Codurile camerelor și cuvântul de pe cartelă sunt cuvinte nevide, formate din maximum 20 de litere mici ale alfabetului englez.
  • Pentru datele de test, Făt-Frumos va putea ieși întotdeauna din bârlogul zmeului.
  • Cuvântul a este un subșir al cuvântului b dacă literele din a se găsesc în b în aceeași ordine. De exemplu arma este un subșir al cuvântului marama, dar nu și al cuvântului tamara.
  • Pentru teste valorând 40% din punctaj cerința este 1.
  • În concurs s-au acordat 10 puncte din oficiu. Aici se acordă pentru testele din exemple.

Exemplul 1:

barlog.in

1
5 4
ana are mere bune
dana cere pere multe
cra ana vrea pere
dar dan nu are
sunt bune pe care
3 2 caravana

barlog.out

7

Exemplul 2:

barlog.in

2
5 4
ana are mere bune
dana cere pere multe
cra ana vrea pere
dar dan nu are
sunt bune pe care
3 2 caravana

barlog.out

2

Explicație

Camerele în care poate intra Făt-Frumos sunt: (3,2), (3,3), (2,2), (3,1), (4,2), (2,1), (4,1). Poate ieși din bârlog prin camera (3,1).

#include <bits/stdc++.h>



using namespace std;

ifstream cin("barlog.in");
ofstream cout("barlog.out");

#define MaxN 101
#define Smax 21
#define Inf 0x3f3f3f

int cer, n, m, Xf, Yf;
bool ok[MaxN][MaxN];
char mat[MaxN][MaxN][Smax];
int dist[MaxN][MaxN] = {Inf} , nr;

struct poz
{
    int i , j;
};

const int di[] = {0, 0, 1, -1};
const int dj[] = {1, -1, 0, 0};

queue <poz>Q;
int inside(int i , int j)
{
    return i >= 1 && i <= n && j >= 1 && j <= m;
}

void lee(int i , int j)
{
    poz x;
    x.i = i;
    x.j = j;
    Q.push(x);
    nr++;
    dist[i][j] = 1;
    while(!Q.empty())
    {
        x = Q.front();
        for(int i = 0 ; i < 4 ; i++)
        {
            int inou = x.i + di[i];
            int jnou = x.j + dj[i];
            if(inside(inou , jnou) && ok[x.i][x.j] == 1 && dist[inou][jnou] == 0)
            {
                poz y;
                y.i = inou;
                y.j = jnou;
                Q.push(y);
                dist[inou][jnou] = dist[x.i][x.j] + 1;
                nr++;
            }
        }
        Q.pop();
    }
}

bool searchs(char a[], char b[])
{
    int i = 0, n = strlen(a);
    int indb = 0, lb = strlen(b);
    while (i < n)
    {
        if (a[i] == b[indb])i ++, indb ++;
        else i ++;
        if (indb == lb)return 1;
    }
    return 0;
}
int main()
{
    char cheie[Smax];

    cin >> cer >> n >> m;
    for (int i = 1; i <= n; ++ i)
        for (int j = 1; j <= m; ++ j)
            cin >> mat[i][j];

    cin >> Xf >> Yf;
    cin >> cheie;

    int nr1 = 0;
    for (int i = 1; i <= n; ++ i)
        for (int j = 1; j <= m; ++ j)
        {
            if (searchs(cheie, mat[i][j]))
            {
                ok[i][j] = 1;

            }
        }
        lee(Xf, Yf);
        int dmin = Inf;
        for(int i = 1; i <= n; ++ i)
        {
            if(dist[i][1] != 0 && ok[i][1] == 1)
                dmin = min(dmin, dist[i][1]);
            if(dist[i][m] != 0 && ok[i][m] == 1)
                dmin = min(dmin, dist[i][m]);
        }

        for (int i = 1; i <= m; ++ i)
        {
            if(dist[1][i] != 0 && ok[1][i] == 1)
                dmin = min(dmin, dist[1][i]);
            if(dist[n][i] != 0 && ok[n][i] == 1)
                dmin = min(dmin, dist[n][i]);
        }
    if(cer == 2)cout << dmin;
    else cout << nr;
    return 0;
}
Comentarii

S-ar putea sa iti placa