Pagini recente » Istoria paginii runda/concurs_elf1 | Istoria paginii runda/simulare_nr1 | Cod sursa (job #136937) | Istoria paginii utilizator/emma19 | Cod sursa (job #2893990)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("rj.in");
ofstream fout("rj.out");
queue < pair <int, int> > coada;
int dx[] = { 0, 1, 0, -1, -1, 1, 1, -1 };
int dy[] = { 1, 0, -1, 0, 1, 1, -1, -1 };
int mat[110][110];
int a[110][110], b[110][110];
int n, m;
int x, y;
int iR, jR, iJ, jJ;
char c[110][110];
int tmin = 20000;
int pozi, pozj;
bool border(int a, int b)
{
return a >= 1 && a <= n && b >= 1 && b <= m;
}
void Lee1()
{
while (!coada.empty())
{
x = coada.front().first;
y = coada.front().second;
coada.pop();
for (int i = 0; i <= 7; i++)
{
int inou = x + dx[i];
int jnou = y + dy[i];
if (border(inou, jnou) && a[inou][jnou] == 0 && mat[inou][jnou] == 0)
{
a[inou][jnou] = a[x][y] + 1;
coada.push(make_pair(inou, jnou));
}
}
}
}
void Lee2()
{
while (!coada.empty())
{
x = coada.front().first;
y = coada.front().second;
coada.pop();
for (int i = 0; i <= 7; i++)
{
int inou = x + dx[i];
int jnou = y + dy[i];
if (border(inou, jnou) && b[inou][jnou] == 0 && mat[inou][jnou] == 0)
{
b[inou][jnou] = b[x][y] + 1;
coada.push(make_pair(inou, jnou));
}
}
}
}
int main()
{
fin >> n >> m;
for (int i = 0; i <= n; i++)
fin.getline(c[i], 101);
for(int i = 1; i <= n; i++)
for (int j = 0; j < m; j++)
{
if (c[i][j] == 'X')
mat[i][j + 1] = -1;
else if (c[i][j] == 'R')
{
iR = i;
jR = j + 1;
a[i][j + 1] = 1;
}
else if (c[i][j] == 'J')
{
iJ = i;
jJ = j + 1;
b[i][j + 1] = 1;
}
}
coada.push(make_pair(iR, jR));
Lee1();
coada.push(make_pair(iJ, jJ));
Lee2();
for(int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
if (a[i][j] == b[i][j] && a[i][j] != 0)
{
if (a[i][j] < tmin)
{
tmin = a[i][j];
pozi = i;
pozj = j;
}
else if (a[i][j] == tmin)
{
if (i < pozi)
pozi = i;
else if (i == pozi)
{
if (j < pozj)
pozj = j;
}
}
}
}
fout << tmin << " " << pozi << " " << pozj;
}