#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int MAX = 10;
char map[MAX][MAX];
bool visited[MAX][MAX][MAX][MAX];
int n, m;
int cnt;
int pdir = -1;
int ry, rx, by, bx;
int nry, nrx, nby, nbx;
int rnewy, rnewx;
int bnewy, bnewx;
typedef struct{
int ry, rx, by, bx;
}Point;
queue<Point> q;
typedef struct{
int y, x;
}Dir;
Dir moveDir[4] = {{-1,0},{0,1},{1,0},{0,-1}}; //북동남서
int blue_y, blue_x, red_y, red_x;
int whole_y, whole_x;
void bfs()
{
while(!q.empty())
{
int qsize = q.size();
while(qsize--)
{
ry = q.front().ry;
rx = q.front().rx;
by = q.front().by;
bx = q.front().bx;
q.pop();
//맨 처음에는 초기 빨간공, 파란공 위치
//다음부터는 벽 만날때까지 굴러간 후
//겹치지 않게 위치 조정된 빨간공, 파란공 위치
if(map[ry][rx]=='O' && map[by][bx]!='O') return;
for(int i = 0 ; i < 4 ; i++)
{
nry = ry;
nrx = rx;
nby = by;
nbx = bx;
while(1) //레드 굴리기
{
rnewy = nry+moveDir[i].y;
rnewx = nrx+moveDir[i].x;
if(map[rnewy][rnewx] == '#' || map[nry][nrx]=='O') break;
nry = rnewy;
nrx = rnewx;
}
while(1) //블루 굴리기
{
bnewy = nby+moveDir[i].y;
bnewx = nbx+moveDir[i].x;
if(map[bnewy][bnewx] == '#' || map[nby][nbx]=='O') break;
nby = bnewy;
nbx = bnewx;
}
if(nry==nby && nrx==nbx) //빨간구슬 파란구슬 위치 같으면?
{
if(map[nby][nbx] == 'O') continue; //파란공이 구멍에 있으면
if(abs(ry-nry)+abs(rx-nrx)>abs(by-nby)+abs(bx-nbx)) //red의 이동거리가 blue보다 크면
{
//red가 더 뒤에있던 거니까 뒤로 옮겨줌
nry-=moveDir[i].y;
nrx-=moveDir[i].x;
}else{
//blue가 더 뒤에있던 거니까 뒤로 옮겨줌
nby-=moveDir[i].y;
nbx-=moveDir[i].x;
}
}
if(visited[nry][nrx][nby][nbx]) continue;
visited[nry][nrx][nby][nbx] = 1;
q.push({nry, nrx, nby, nbx});
}
}
if(cnt==10)
{
cnt = -1;
return;
}
cnt++;
}
cnt = -1;
return;
}
int main() {
// your code goes here
cin >> n >> m;
for(int i = 0 ; i < n ; i++)
{
for(int j = 0 ; j < m ; j++)
{
scanf("%1s", &map[i][j]);
if(map[i][j] == 'B') //파란공
{
blue_y = i;
blue_x = j;
}
else if(map[i][j] == 'R') //빨간공
{
red_y = i;
red_x = j;
}
else if(map[i][j] == 'O') //구멍
{
whole_y = i;
whole_x = j;
}
}
}
visited[red_y][red_x][blue_y][blue_x] = 1; //방문표시
q.push({red_y, red_x, blue_y, blue_x});
bfs();
cout << cnt << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxjc3RyaW5nPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IE1BWCA9IDEwOwpjaGFyIG1hcFtNQVhdW01BWF07CmJvb2wgdmlzaXRlZFtNQVhdW01BWF1bTUFYXVtNQVhdOwoKaW50IG4sIG07CmludCBjbnQ7CmludCBwZGlyID0gLTE7CgppbnQgcnksIHJ4LCBieSwgYng7CmludCBucnksIG5yeCwgbmJ5LCBuYng7CmludCBybmV3eSwgcm5ld3g7CmludCBibmV3eSwgYm5ld3g7Cgp0eXBlZGVmIHN0cnVjdHsKCWludCByeSwgcngsIGJ5LCBieDsKfVBvaW50OwpxdWV1ZTxQb2ludD4gcTsKCnR5cGVkZWYgc3RydWN0ewoJaW50IHksIHg7Cn1EaXI7CgpEaXIgbW92ZURpcls0XSA9IHt7LTEsMH0sezAsMX0sezEsMH0sezAsLTF9fTsgLy/rtoHrj5nrgqjshJwKCmludCBibHVlX3ksIGJsdWVfeCwgcmVkX3ksIHJlZF94OwppbnQgd2hvbGVfeSwgd2hvbGVfeDsKCnZvaWQgYmZzKCkKewoJd2hpbGUoIXEuZW1wdHkoKSkKCXsKCQlpbnQgcXNpemUgPSBxLnNpemUoKTsKCQl3aGlsZShxc2l6ZS0tKQoJCXsKCQkJcnkgPSBxLmZyb250KCkucnk7CgkJCXJ4ID0gcS5mcm9udCgpLnJ4OwoJCQlieSA9IHEuZnJvbnQoKS5ieTsKCQkJYnggPSBxLmZyb250KCkuYng7CgkJCXEucG9wKCk7CgkJCQoJCQkvL+unqCDsspjsnYzsl5DripQg7LSI6riwIOu5qOqwhOqztSwg7YyM656A6rO1IOychOy5mAoJCQkvL+uLpOydjOu2gO2EsOuKlCDrsr0g66eM64Kg65WM6rmM7KeAIOq1tOufrOqwhCDtm4QKCQkJLy/qsrnsuZjsp4Ag7JWK6rKMIOychOy5mCDsobDsoJXrkJwg67mo6rCE6rO1LCDtjIzrnoDqs7Ug7JyE7LmYCgkJCQoJCQlpZihtYXBbcnldW3J4XT09J08nICYmIG1hcFtieV1bYnhdIT0nTycpIHJldHVybjsKCQkJZm9yKGludCBpID0gMCA7IGkgPCA0IDsgaSsrKQoJCQl7CgkJCQlucnkgPSByeTsKCQkJCW5yeCA9IHJ4OwoJCQkJbmJ5ID0gYnk7CgkJCQluYnggPSBieDsKCQkJCQoJCQkJd2hpbGUoMSkgLy/roIjrk5wg6rW066as6riwCgkJCQl7CgkJCQkJcm5ld3kgPSBucnkrbW92ZURpcltpXS55OwoJCQkJCXJuZXd4ID0gbnJ4K21vdmVEaXJbaV0ueDsKCQkJCQlpZihtYXBbcm5ld3ldW3JuZXd4XSA9PSAnIycgfHwgbWFwW25yeV1bbnJ4XT09J08nKSBicmVhazsKCQkJCQlucnkgPSBybmV3eTsKCQkJCQlucnggPSBybmV3eDsKCQkJCX0KCQkJCQoJCQkJd2hpbGUoMSkgLy/ruJTro6gg6rW066as6riwCgkJCQl7CgkJCQkJYm5ld3kgPSBuYnkrbW92ZURpcltpXS55OwoJCQkJCWJuZXd4ID0gbmJ4K21vdmVEaXJbaV0ueDsKCQkJCQlpZihtYXBbYm5ld3ldW2JuZXd4XSA9PSAnIycgfHwgbWFwW25ieV1bbmJ4XT09J08nKSBicmVhazsKCQkJCQluYnkgPSBibmV3eTsKCQkJCQluYnggPSBibmV3eDsKCQkJCX0KCQkJCQoJCQkJaWYobnJ5PT1uYnkgJiYgbnJ4PT1uYngpIC8v67mo6rCE6rWs7IqsIO2MjOuegOq1rOyKrCDsnITsuZgg6rCZ7Jy866m0PwoJCQkJewoJCQkJCWlmKG1hcFtuYnldW25ieF0gPT0gJ08nKSBjb250aW51ZTsgLy/tjIzrnoDqs7XsnbQg6rWs66mN7JeQIOyeiOycvOuptCAKCQkJCQlpZihhYnMocnktbnJ5KSthYnMocngtbnJ4KT5hYnMoYnktbmJ5KSthYnMoYngtbmJ4KSkgLy9yZWTsnZgg7J2064+Z6rGw66as6rCAIGJsdWXrs7Tri6Qg7YGs66m0CgkJCQkJewoJCQkJCQkvL3JlZOqwgCDrjZQg65Kk7JeQ7J6I642YIOqxsOuLiOq5jCDrkqTroZwg7Jiu6rKo7KSMCgkJCQkJCW5yeS09bW92ZURpcltpXS55OyAKCQkJCQkJbnJ4LT1tb3ZlRGlyW2ldLng7CgkJCQkJfWVsc2V7CgkJCQkJCS8vYmx1ZeqwgCDrjZQg65Kk7JeQ7J6I642YIOqxsOuLiOq5jCDrkqTroZwg7Jiu6rKo7KSMCgkJCQkJCW5ieS09bW92ZURpcltpXS55OwoJCQkJCQluYngtPW1vdmVEaXJbaV0ueDsKCQkJCQl9CgkJCQl9CgkJCQkKCQkJCWlmKHZpc2l0ZWRbbnJ5XVtucnhdW25ieV1bbmJ4XSkgY29udGludWU7CgkJCQl2aXNpdGVkW25yeV1bbnJ4XVtuYnldW25ieF0gPSAxOwoJCQkJcS5wdXNoKHtucnksIG5yeCwgbmJ5LCBuYnh9KTsKCQkJfQoJCX0KCQlpZihjbnQ9PTEwKQoJCXsKCQkJY250ID0gLTE7CgkJCXJldHVybjsKCQl9CgkJY250Kys7Cgl9CgljbnQgPSAtMTsKCXJldHVybjsKfQoKaW50IG1haW4oKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCgkKCgljaW4gPj4gbiA+PiBtOwoJZm9yKGludCBpID0gMCA7IGkgPCBuIDsgaSsrKQoJewoJCWZvcihpbnQgaiA9IDAgOyBqIDwgbSA7IGorKykKCQl7CgkJCXNjYW5mKCIlMXMiLCAmbWFwW2ldW2pdKTsKCQkJaWYobWFwW2ldW2pdID09ICdCJykgLy/tjIzrnoDqs7UKCQkJewoJCQkJYmx1ZV95ID0gaTsKCQkJCWJsdWVfeCA9IGo7CgkJCX0KCQkJZWxzZSBpZihtYXBbaV1bal0gPT0gJ1InKSAvL+u5qOqwhOqztQoJCQl7CgkJCQlyZWRfeSA9IGk7CgkJCQlyZWRfeCA9IGo7CgkJCX0KCQkJZWxzZSBpZihtYXBbaV1bal0gPT0gJ08nKSAvL+q1rOupjQoJCQl7CgkJCQl3aG9sZV95ID0gaTsKCQkJCXdob2xlX3ggPSBqOwoJCQl9CgkJfQoJfQoJCgl2aXNpdGVkW3JlZF95XVtyZWRfeF1bYmx1ZV95XVtibHVlX3hdID0gMTsgLy/rsKnrrLjtkZzsi5wKCXEucHVzaCh7cmVkX3ksIHJlZF94LCBibHVlX3ksIGJsdWVfeH0pOwoJYmZzKCk7CgkKCWNvdXQgPDwgY250IDw8IGVuZGw7CglyZXR1cm4gMDsKfQ==