334
În ultima ecranizare a celebrei piese shakespeariene Romeo și Julieta trăiesc într-un oraș modern, comunică prin e-mail și chiar învață să programeze. Într-o secvență tulburătoare sunt prezentate frământările interioare ale celor doi eroi încercând fără succes să scrie un program care să determine un punct optim de întâlnire.
Exemplu
rj.in
5 8
XXR XXX
X X X
J X X X
XX
XXX XXXX
rj.out
4 4 4
Explicație
Traseul lui Romeo poate fi: (1,3), (2,4), (3,4), (4,4). Deci timpul necesar lui Romeo pentru a ajunge de acasă la punctul de întâlnire este 4. Traseul Julietei poate fi: (3,1), (4,2), (4,3), (4,5). Timpul necesar Julietei pentru a ajunge de acasă la punctul de întâlnire este de asemenea 4. În plus, 4 este punctul cel mai apropiat de ei cu această proprietate.
#include <bits/stdc++.h>
using namespace std;
ifstream cin("rj.in");
ofstream cout("rj.out");
int n, m, xr, yr, xj, yj;
int dl[8]={0, 1, 0, -1, -1, 1, -1, 1};
int dc[8]={1, 0, -1, 0, -1, 1, 1,-1};
char l[102][102];
int r[102][102];
void citire(void);
void afisare(int [102][102]);
void parcurge (int, int, int[102][102]);
int main()
{
int j[102][102];
citire();
parcurge(xr, yr, r);
parcurge(xj, yj, j);
afisare(j);
return 0;
}
void citire(void)
{
int i, k;
char c;
cin>>n>>m;
for(i = 0; i <= n + 1 ; i++) l[i][0]=l[i][m+1]='X';
for(i = 0; i <= m + 1 ; i++) l[0][i]=l[n+1][i]='X';
cin.get(c);
for(i = 1 ; i <= n ; i++)
{
for(k = 1 ; k <= m ; k++)
{
cin.get(c);
l[i][k]=c;
if (l[i][k]=='R') {xr=i; yr=k; l[i][k]=' ';}
if (l[i][k]=='J') {xj=i; yj=k; l[i][k]=' ';}
}
cin.get(c);
}
cin.close();
}
void parcurge (int x0, int y0, int d[102][102])
{
struct Punct {int l, c;} C[10005], p;
int inc = 0 , sf = 0 , i , k;
for(i = 0 ; i <= n + 1 ; i++)
for(k = 0 ; k <= m + 1 ; k++) d[i][k]=-1;
C[0].l=x0; C[0].c=y0; d[x0][y0]=1;
while(inc <= sf)
{
p=C[inc++];
for (i=0; i<8; i++)
if(l[p.l+dl[i]][p.c+dc[i]]==' ' && d[p.l+dl[i]][p.c+dc[i]]==-1)
{
d[p.l+dl[i]][p.c+dc[i]]=1+d[p.l][p.c];
C[++sf].l=p.l+dl[i];
C[sf].c=p.c+dc[i];
}
}
}
void afisare(int j[102][102])
{
int tmin=102*102+5, xmin=-1, ymin=-1, i, k;
for(i = 1 ; i <= n ; i++)
for(k = 1; k <= m ; k++)
if(r[i][k]==j[i][k])
if(r[i][k]<tmin && r[i][k]!=-1)
{tmin=r[i][k]; xmin=i; ymin=k;}
cout<<tmin<<' '<<xmin<<' '<<ymin<<endl;
cout.close();
}
Comentarii