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