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:
Exemplu
ferma1.in
12 11 ........... ...+.....+. ........... ........... .+......... ...+....... .+...R..... .........+. ..+.......+ ......+.... ........... ......+....
ferma1.out
....*****.. ...+*****+. ..********* ..********* .+********* ...+******* .+.******** ...******+. ..+******.+ ******+.... ******..... ******+....
#include <bits/stdc++.h> using namespace std; ifstream cin("ferma1.in"); ofstream cout("ferma1.out"); const int di[] = {-1 , 0 , 1 , 0}; const int dj[] = { 0 , 1 , 0 , -1}; int a[53][53] , n , m , ir , jr; char b[53][53]; int inside(int i , int j) { return i >= 1 && i <= n && j >= 1 && j <= m; } int ok(int i , int j) { for(int x = -1 ; x <= 1 ; x++) for(int y = -1 ; y <= 1 ; y++) if(!(inside(i+x , j+y)) || a[i+x][j+y] == 1) return 0; return 1; } void afisare() { for(int i = 1 ; i <= n ; i++) { for(int j = 1 ; j <= m; j ++) cout << b[i][j]; cout << '\n'; } } void fill(int i , int j) { a[i][j] = 2; for(int x = -1 ; x <= 1 ; x++) for(int y = -1 ; y <= 1 ; y++) b[i+x][j+y] = '*'; for(int d = 0 ; d < 4 ; d++) { int inou = i + di[d]; int jnou = j + dj[d]; if(ok(inou , jnou) && a[inou][jnou] == 0) fill(inou , jnou); } } int main() { cin >> n >> m; for(int i = 1 ; i <= n ; i++) for(int j = 1 ; j <= m ; j++) { char c; cin >> c; b[i][j] = c; if(c == 'R') { ir = i; jr = j; } else if(c == '+') a[i][j] = 1; } fill(ir , jr); afisare(); }