Rezolvare completă PbInfo #2588 Iepuras1

Un iepuraş se găseşte într-o grădină plină de surprize. Harta grădinii poate fi reprezentată sub forma unei table dreptunghiulare cu m linii, numerotate de la 1 la m de sus în jos, şi n coloane, numerotate de la 1 la n de la stânga la dreapta. În fiecare celulă a acestei grădini se poate găsi cel mult una dintre următoarele surprize: săgeată, pom, zid, trapă, morcov, bombă.

O săgeată indică una din direcţiile nord, sud, est, vest. Odată ajuns într-o celulă conţinând o astfel de săgeată iepuraşul îşi va continua deplasarea în sensul indicat de săgeată, iar aceasta dispare.

Într-o celulă în care se găseşte un pom sau un zid iepuraşul nu poate să pătrundă, însă dacă se “loveşte” de un pom, el îşi păstrează direcţia, însă schimbă sensul (dacă se deplasa spre nord, îşi va schimba sensul spre sud, dacă se deplasa spre est, se va deplasa după aceea spre vest etc).

Dacă iepuraşul intră într-o celulă conţinând o trapă, toate zidurile aflate pe teren dispar şi vor apărea alte ziduri, în poziţii precizate. Dacă iepuraşul va trece din nou printr-o celulă conţinând o trapă, zidurile nou construite dispar şi vor reapărea zidurile iniţiale. Mai exact există două grupe de ziduri care comută la fiecare trecere printr-o celulă care conţine o trapă.

Dacă iepuraşul va trece de două ori prin vecinătatea unei celule conţinând o bombă (adică prin celulele învecinate la sud, nord, est sau vest cu celula conţinând bombă), bomba va exploda iar iepuraşul se transformă instantaneu în îngeraş. De asemenea, dacă iepuraşul întră într-o celulă conţinând o bombă se transformă instantaneu în îngeraș.

Iepuraşul va ronţăi toţi morcovii care îi ies în cale. Evident că dacă trece a doua oară prin aceeaşi celulă, la a doua trecere nu va mai găsi morcov.

Surprizele din grădină sunt codificate astfel: 1 pentru săgeată spre nord, 2 pentru săgeată spre vest, 3 pentru săgeată spre sud, 4 pentru săgeată spre est, 5 pentru pom, 6 pentru bombă, 7 pentru morcov, 8 pentru zid, 9 pentru trapă. Căsuţele libere de pe harta grădinii se codifică cu 0.

Iniţial, se cunosc poziţia şi sensul de deplasare ale iepuraşului. Expediţia acestuia se termină în următoarele situaţii:

  • la explozia unei bombe, caz in care se transforma in ingeras;
  • la parasirea gradinii (adica la iesirea in afara zonei dreptunghiulare date), caz in care se rataceste;
  • in momentul in care reuseste sa rontaie toti morcovii, caz in care este fericit.

Cerința

Fiind data harta grădinii se cere să se determine starea finală a iepuraşului (îngeraş, rătăcit respectiv fericit), numărul de morcovi ronţăiţi până în momentul terminării expediţiei, precum şi numărul de paşi pe care îi face iepuraşul până la acest moment.

Date de intrare

Pe prima linie a fişierului de intrare iepuras1.in se găsesc două numere întregi m şi n, separate printr-un spaţiu, reprezentând numărul de linii, respectiv numărul de coloane ale hărţii.

Linia a doua a fişierului conţine trei numere naturale, separate prin câte un spaţiu, reprezentând linia si coloana poziţiei iniţiale a iepuraşului pe hartă precum şi direcţia spre care acesta este orientat. Direcţia este codificată astfel: 1 pentru nord, 2 pentru vest, 3 pentru sud, 4 pentru est.

Următoarele m linii conţin câte n numere întregi separate prin câte un spaţiu, reprezentând codificarea hărţii grădinii, conform celor precizate mai sus.

Următoarea linie conţine un singur număr natural t reprezentând numărul de celule ce vor conţine ziduri după prima trecere printr-o celulă conţinând o trapă. Următoarele t linii conţin câte două numere naturale i şi j, separate printr-un spaţiu, reprezentând coordonatele câte unei celule ce va conţine zid după o primă trecere printr-o celulă conţinând o trapă.

Date de ieșire

Fişierul de ieşire iepuras1.out va conţine pe prima sa linie unul dintre cuvintele INGERAS, RATACIT respectiv FERICIT, corespunzător stării finale a iepuraşului. A doua linie a fişierului va conţine două numere întregi separate printr-un spaţiu, reprezentând linia şi coloana ultimei poziţii de pe teren a iepuraşului, adică poziţia în care a murit, sau în care a devenit fericit, respectiv ultima poziţie a sa de pe teren, înainte de a se rătăci.

A treia linie a fişierului va conţine două numere întregi separate printr-un spaţiu, reprezentând numărul de morcovi culeşi până în momentul terminării expediţiei, respectiv numărul de paşi pe care îi face iepuraşul până ajunge în starea finală.

Restricții și precizări

  • poziţia iniţială a iepuraşului este una validă, adică este o celulă liberă din interiorul terenului;
  • pentru datele de test, se asigură că iepuraşul va face un număr finit de paşi până la terminarea expediţiei sale;
  • 1 ≤ m, n ≤ 200
  • 0 ≤ t ≤ 20
  • numărul maxim de ziduri aflate la un moment dat pe teren este de cel mult 50, şi este posibil ca la un moment dat să nu existe niciun zid pe teren.
  • Se garantează că pentru datele de intrare iepuraşul nu poate ajunge simultan în două din cele trei stări.
  • Pomii şi trapele sunt obiecte care rămân permanent în teren, în poziţiile lor iniţiale.
  • Într-o celulă a grădinii se poate găsi la un moment dat o singură surpriză (pom, zid, trapă, morcov, săgeată, bombă).

Exemplu 1:

iepuras1.in

10 15
7 1 4
0 0 6 0 5 5 0 7 0 0 0 0 0 0 0
0 0 0 0 5 5 0 0 4 0 0 0 0 0 3
0 5 5 0 5 5 0 0 0 0 0 0 0 0 0 
0 5 5 0 5 5 0 1 7 0 0 7 0 0 2
0 0 0 0 5 5 0 0 0 0 0 0 0 0 0
0 0 0 0 0 5 0 0 0 0 0 0 0 0 0
0 3 0 0 0 5 6 0 0 5 5 5 0 0 0
0 7 0 0 0 0 0 0 0 0 0 0 0 5 0
0 4 0 0 0 7 0 0 3 5 0 0 0 5 0
0 6 0 0 0 0 0 0 1 5 0 0 0 5 0
0 

iepuras1.out

FERICIT
1 8
5 37

Exemplu 2:

iepuras1.in

4 3
2 1 3
0 0 0 
0 0 0 
9 6 7 
8 0 0 
4
4 3
1 2
1 3
2 3

iepuras1.out

RATACIT
4 1
0 3

Exemplu 3:

iepuras1.in

6 5
2 1 3
0 0 0 7 0
0 0 0 0 0
9 6 7 2 0
8 0 0 0 0
7 8 0 0 0
4 8 9 1 0
4
4 4
5 4
1 5
2 5

iepuras1.out

INGERAS
3 3
2 11

Exemplu 4:

iepuras1.in

5 4
2 1 3
4 0 7 0
0 0 0 0
0 0 0 0
5 0 0 0
0 0 0 0
0

iepuras1.out

FERICIT
1 3
1 5

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Iepuras1:

#include <iostream>
#include <fstream>

using namespace std;

int m,n;
char a[201][201];
int di[4]={-1,0,1,0};
int dj[4]={0,-1,0,1};
struct zid{ int i,j; };
zid z1[50],z2[50];


int afara(int i,int j)
{  if (i<1 || i>m) return 1;
   if (j<1 || j>n) return 1;
   return 0;
}

int explod(int i,int j)
{  int k,i1,j1;
   if (a[i][j]=='6' || a[i][j]=='*')
     return 1;
   for (k=0;k<4;k++)
   {  i1=i+di[k];
      j1=j+dj[k];
      if (i1>=0 && i1<=m && j1>=1 && j1<=n)
    if (a[i1][j1]=='6')
      a[i1][j1]='*';
    else
      if (a[i1][j1]=='*')
        return 1;
   }
   return 0;
}

int main()
{  int k,i0,j0,d,i,j,n1=0,n2=0,pz=1;
   long nrm,p=0,q=0;
   ifstream f("iepuras1.in");
   ofstream g("iepuras1.out");

   nrm=0;
   f>>m>>n;
   f>>i0>>j0>>d;
   for (i=1;i<=m;i++)
     for (j=1;j<=n;j++)
     {  f>>a[i][j];
    if (a[i][j]=='7') nrm++;
    if (a[i][j]=='8')
    { z1[n1].i=i;
      z1[n1].j=j; n1++;
    }
     }
   f>>n2;
   for (i=0;i<n2;i++)
     f>>z2[i].i>>z2[i].j;
   f.close();

   i=i0; j=j0;
   while (1)
   { i=i+di[d-1]; j=j+dj[d-1]; p++;

     if (i==3 && j==190)
       cout<<"bla";
     // afara
     if (afara(i,j))
     {  g<<"RATACIT"<<endl;
    g<<i-di[d-1]<<" "<<j-dj[d-1]<<endl;
    g<<q<<" "<<p;
    break;
     }

     // morcov
     if (a[i][j]=='7') { q++; a[i][j]='0'; }

     // e bomba sau in vecinatatea unei bombe pregatita sa explodeze
     if (explod(i,j))
     {  g<<"INGERAS"<<endl;
    g<<i<<" "<<j<<endl;
    g<<q<<" "<<p;
    break;
     }

     // a cules toti morcovii
     if (q==nrm)
     {  g<<"FERICIT"<<endl;
    g<<i<<" "<<j<<endl;
    g<<q<<" "<<p;
    break;
     }

     if (a[i][j]=='9')
     {  if (pz==1)
    { for (k=0;k<n1;k++)
        a[z1[k].i][z1[k].j]='0';
      for (k=0;k<n2;k++)
        a[z2[k].i][z2[k].j]='8';
      pz=2;
    }
    else
    { for (k=0;k<n2;k++)
        a[z2[k].i][z2[k].j]='0';
      for (k=0;k<n1;k++)
        a[z1[k].i][z1[k].j]='8';
      pz=1;
    }
     }

     // sageata, schimba directia
     if (a[i][j]=='1') { d=1; a[i][j]='0'; }
     if (a[i][j]=='2') { d=2; a[i][j]='0'; }
     if (a[i][j]=='3') { d=3; a[i][j]='0'; }
     if (a[i][j]=='4') { d=4; a[i][j]='0'; }

     // pom sau zid, schimba directia
     if (a[i+di[d-1]][j+dj[d-1]]=='5' || a[i+di[d-1]][j+dj[d-1]]=='8')
       if (d==1) d=3;
       else
    if (d==2) d=4;
    else
      if (d==3) d=1;
      else
        d=2;

   }
   g.close();
 return 0;

}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2588 Iepuras1

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2588 Iepuras1 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!