Informatică, întrebare adresată de pmarian98, 8 ani în urmă

#2313 ferma1

Un fermier are un teren care are forma unui tablou dreptunghiular de N x M unități. Pe teren sunt plantați din loc în loc copaci, pe care fermierul nu dorește sa-i taie. Dorind să-și supravegheze cultura, fermierul realizează un mic robot de forma pătrată având latura de 3 unități pe care îl poate teleghida prin fermă, parcurgând unitate cu unitate o anumită suprafață. Robotul se poate mișca pe verticală și pe orizontală dar nu poate trece peste copaci, nu îi poate distruge, nu se poate roti și are nevoie pentru mișcare de o suprafață corespunzătoare dimensiunii lui.

Cerința
Ajutați-l pe fermier sa determine suprafața maxima pe care o poate urmări, folosind acest sistem.

Date de intrare
Fișierul de intrare ferma1.in conține pe prima linie doua numere naturale nenule N și M, separate printr-un spațiu, reprezentând numărul de linii, respectiv numărul de coloane. Fiecare din următoarele N linii conține câte M caractere (fără sa fie separate prin spatii) având semnificația:
. – teren liber;
+ – locul în care este plantat un copac;
R – centrul robotului.

Date de ieșire
Fișierul de ieșire ferma1.out va conține N linii, fiecare linie având câte M caractere (fără spații) având semnificația:
. – teren neacoperit de robot;
* – teren ce poate fi verificat de robot;
+ – loc în care a rămas copacul.

Restricții și precizări
1 <= N,M <= 50
Inițial robotul se află pe o poziție pe care nu se află copaci



Exemplu
ferma1.in

12 11
...........
...+.....+.
...........
...........
.+.........
...+.......
.+...R.....
.........+.
..+.......+
......+....
...........
......+....
ferma1.out

....*****..
...+*****+.
..*********
..*********
.+*********
...+*******
.+.********
...******+.
..+******.+
******+....
******.....
******+....

Răspunsuri la întrebare

Răspuns de mocanualexandrp2ikb6
4

#include <fstream>

using namespace std;

int n,m;

char a[51][51]; /// a=ferma

const char liber='.',copac='+',robot='*';

 

void afism()

{

   ofstream g("ferma1.out");

   for(int i=1;i<=n;++i)

   {

       for(int j=1;j<=m;++j)

           g<<a[i][j];

       g<<'\n';

   }

   g.close();

}

 

void deplasareDin(int ir,int jr)

{

   if(ir-2>=1) /// sus

       if((a[ir-2][jr-1]!=copac)&&(a[ir-2][jr]!=copac)&&(a[ir-2][jr+1]!=copac))

           if((a[ir-2][jr-1]==liber)||(a[ir-2][jr]==liber)||(a[ir-2][jr+1]==liber))

           {

               a[ir-2][jr-1]=a[ir-2][jr]=a[ir-2][jr+1]=robot;

               deplasareDin(ir-1,jr);

           }

   if(ir+2<=n) /// jos

       if((a[ir+2][jr-1]!=copac)&&(a[ir+2][jr]!=copac)&&(a[ir+2][jr+1]!=copac))

           if((a[ir+2][jr-1]==liber)||(a[ir+2][jr]==liber)||(a[ir+2][jr+1]==liber))

           {

               a[ir+2][jr-1]=a[ir+2][jr]=a[ir+2][jr+1]=robot;

               deplasareDin(ir+1,jr);

           }

   if(jr-2>=1) /// stanga

       if((a[ir-1][jr-2]!=copac)&&(a[ir][jr-2]!=copac)&&(a[ir+1][jr-2]!=copac))

           if((a[ir-1][jr-2]==liber)||(a[ir][jr-2]==liber)||(a[ir+1][jr-2]==liber))

           {

               a[ir-1][jr-2]=a[ir][jr-2]=a[ir+1][jr-2]=robot;

               deplasareDin(ir,jr-1);

           }

   if(jr+2<=m) /// dreapta

       if((a[ir-1][jr+2]!=copac)&&(a[ir][jr+2]!=copac)&&(a[ir+1][jr+2]!=copac))

           if((a[ir-1][jr+2]==liber)||(a[ir][jr+2]==liber)||(a[ir+1][jr+2]==liber))

           {

               a[ir-1][jr+2]=a[ir][jr+2]=a[ir+1][jr+2]=robot;

               deplasareDin(ir,jr+1);

           }

}

 

int main()

{

   int ic=0,jc=0;

   ifstream f("ferma1.in");

   f>>n>>m;

   for(int i=1;i<=n;++i)

       for(int j=1;j<=m;++j)

           f>>a[i][j];

   for(int i=1;i<=n;++i)

       for(int j=1;j<=m;++j)

           if(a[i][j]=='R')

               {ic=i; jc=j; break;};

   for(int i=-1;i<=1;++i)

       for(int j=-1;j<=1;++j)

           a[ic+i][jc+j]=robot;

   deplasareDin(ic,jc);

   afism();

}


DFAforReal20: Perfect codul! Foarte bine gandit!
Alte întrebări interesante