Cerința
Se dă o tablă dreptunghiulară formată din n
linii și m
coloane, definind n*m
zone, unele dintre ele fiind libere, altele conținând obstacole. Într-o zonă precizată se află un șoarece care se poate deplasa pe tablă trecând din zona curentă în zona învecinată cu aceasta pe linie sau pe coloană. Scopul sau este să ajungă la o bucată de brânză aflată într-o zonă de asemenea precizată, fără a părăsi tabla, fără a trece prin zone care conțin obstacole și fără a trece de două ori prin aceeași zonă.
Determinați o modalitate prin care șoarecele poate să ajungă la bucata de brânză.
Date de intrare
Fişierul de intrare soarece2.in
conţine pe prima linie numerele n m
, separate printr-un spațiu. Următoarele n
linii conțin câte m
caractere, care descriu tabla: caracterul _
corespunde unei zone libere, caracterul #
corespunde unei zone ocupate de obstacol, caracterul S
corespunde zonei în care se află șoarecele iar caracterul B
corespunde zonei în care se află bucata de brânză.
Date de ieşire
Fişierul de ieşire soarece2.out
va conţine pe prima linie numărul C
de deplasări pe care le face șoarecele.
Următoarea linie va conține C
caractere din mulțimea {N,E,S,V}
, cu următoarea semnificație:
N
– șoarecele se deplasează spreNord
; din zonai j
ajunge în zonai-1 j
E
– șoarecele se deplasează spreEst
; din zonai j
ajunge în zonai j+1
S
– șoarecele se deplasează spreSud
; din zonai j
ajunge în zonai+1 j
V
– șoarecele se deplasează spreVest
; din zonai j
ajunge în zonai j-1
Numerele de pe fiecare linie fișierului de ieșire sunt separate prin exact un spațiu.
Restricţii şi precizări
1 ≤ n,m ≤ 1000
- zona în care se află șoarecele și zona în care se află bucata de brânză sunt libere
- dacă nu există nicio modalitate prin care șoarecele va ajunge la bucata de brânză pe prima linie a fișierului de ieșire se va afla valoarea
0
- oricare traseu valid al șoarecelui este considerat corect
Exemplu
soarece2.in
6 7 _______ _####B_ ____##_ S##_#__ _##_#_# _______
soarece2.out
9 NNNEEEEES
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 Soarece2:
#include <iostream>
#include <fstream>
#include <cassert>
using namespace std;
ifstream fin("soarece2.in");
ofstream fout("soarece2.out");
int n , m;
short a[1001][1001];
int x[1000001], y[1000001];
int ibranza , jbranza;
char P[1001][1001];
const int dx[] = {0 , 0 , 1 , -1}, // E V S N
dy[] = {1 , -1 , 0 , 0};
void reconstituire(int i , int j)
{
if(a[i][j] > 1)
{
for(int k = 0; k < 4 ; k ++)
{
int ii = i + dx[k], jj = j + dy[k];
if(a[ii][jj] == a[i][j] - 1)
{
reconstituire(ii,jj);
switch(k)
{
case 0:
fout << "V";
break;
case 1:
fout << "E";
break;
case 2:
fout << "N";
break;
case 3:
fout << "S";
break;
}
break;
}
}
}
}
int main(){
fin >> n >> m;
int st = 1 , dr = 0;
for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= m ; j ++)
{
fin >> P[i][j];
if(P[i][j] == 'S')
{
dr ++;
x[dr] = i, y[dr] = j;
a[i][j] = 1;
}
if(P[i][j] == 'B')
ibranza = i , jbranza = j;
}
fin.close();
while(st <= dr)
{
int i = x[st], j = y[st];
for(int k = 0 ; k < 4 ; k ++)
{
int ii = i + dx[k], jj = j + dy[k];
if( ii > 0 && ii <= n && jj > 0 && jj <= m && P[ii][jj] !='#' && a[ii][jj] == 0)
{
a[ii][jj] = a[i][j] + 1;
dr ++;
x[dr] = ii, y[dr] = jj;
if(ibranza == ii && jbranza == jj)
{
st = dr + 1;
break;
}
}
}
st ++;
}
if(a[ibranza][jbranza] == 0)
fout << 0;
else
{
fout << a[ibranza][jbranza] - 1 << "\n";
reconstituire(ibranza , jbranza);
}
fout.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 .
Rezolvarea problemei #880 Soarece2
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #880 Soarece2 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!