#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
#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();
}