Pagini recente » Cod sursa (job #862917) | Cod sursa (job #3155039) | Cod sursa (job #3141939) | Cod sursa (job #3218191) | Cod sursa (job #2452966)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rj.in");
ofstream fout("rj.out");
#define MAXNM 105
const short dx[] = {-1,-1,0,1,1,1,0,-1};
const short dy[] = {0,1,1,1,0,-1,-1,-1};
const short dirN = 8;
int n, m, dis[MAXNM][MAXNM], board[MAXNM][MAXNM];
queue < pair <int, int> > tail;
void Read()
{
char c[MAXNM];
fin >> n >> m;
fin.getline(c, MAXNM);
for (int i = 1; i <= n; i++)
{
fin.getline(c, MAXNM);
for (int j = 0; c[j]; j++)
{
switch (c[j])
{
case 'X':
board[i][j + 1] = 1;
break;
case 'R':
board[i][j + 1] = 2;
tail.push(make_pair(i, j + 1));
dis[i][j + 1] = 1;
break;
case 'J':
board[i][j + 1] = 3;
tail.push(make_pair(i, j + 1));
dis[i][j + 1] = 1;
break;
}
}
}
return;
}
inline bool isOk(int x, int y)
{
if (x < 1 || y < 1 || x > n || y > m || board[x][y] == 1)
return false;
return true;
}
void Lee()
{
int x, y, xNext, yNext;
bool ok = true;
while (!tail.empty() && ok)
{
x = tail.front().first;
y = tail.front().second;
tail.pop();
for (int dir = 0; dir < dirN && ok; dir++)
{
xNext = x + dx[dir];
yNext = y + dy[dir];
if (isOk(xNext, yNext) && !dis[xNext][yNext])
{
dis[xNext][yNext] = dis[x][y] + 1;
tail.push(make_pair(xNext, yNext));
}
else if (dis[xNext][yNext] > dis[x][y])
{
fout << dis[xNext][yNext] << ' ' << xNext << ' ' << yNext;
ok = false;
}
}
}
return;
}
int main()
{
Read();
Lee();
return 0;
}