fork download
  1. #include <iostream>
  2. #include <queue>
  3. #include <cstring>
  4. using namespace std;
  5.  
  6. const int MAX = 10;
  7. char map[MAX][MAX];
  8. bool visited[MAX][MAX][MAX][MAX];
  9.  
  10. int n, m;
  11. int cnt;
  12. int pdir = -1;
  13.  
  14. int ry, rx, by, bx;
  15. int nry, nrx, nby, nbx;
  16. int rnewy, rnewx;
  17. int bnewy, bnewx;
  18.  
  19. typedef struct{
  20. int ry, rx, by, bx;
  21. }Point;
  22. queue<Point> q;
  23.  
  24. typedef struct{
  25. int y, x;
  26. }Dir;
  27.  
  28. Dir moveDir[4] = {{-1,0},{0,1},{1,0},{0,-1}}; //북동남서
  29.  
  30. int blue_y, blue_x, red_y, red_x;
  31. int whole_y, whole_x;
  32.  
  33. void bfs()
  34. {
  35. while(!q.empty())
  36. {
  37. int qsize = q.size();
  38. while(qsize--)
  39. {
  40. ry = q.front().ry;
  41. rx = q.front().rx;
  42. by = q.front().by;
  43. bx = q.front().bx;
  44. q.pop();
  45.  
  46. //맨 처음에는 초기 빨간공, 파란공 위치
  47. //다음부터는 벽 만날때까지 굴러간 후
  48. //겹치지 않게 위치 조정된 빨간공, 파란공 위치
  49.  
  50. if(map[ry][rx]=='O' && map[by][bx]!='O') return;
  51. for(int i = 0 ; i < 4 ; i++)
  52. {
  53. nry = ry;
  54. nrx = rx;
  55. nby = by;
  56. nbx = bx;
  57.  
  58. while(1) //레드 굴리기
  59. {
  60. rnewy = nry+moveDir[i].y;
  61. rnewx = nrx+moveDir[i].x;
  62. if(map[rnewy][rnewx] == '#' || map[nry][nrx]=='O') break;
  63. nry = rnewy;
  64. nrx = rnewx;
  65. }
  66.  
  67. while(1) //블루 굴리기
  68. {
  69. bnewy = nby+moveDir[i].y;
  70. bnewx = nbx+moveDir[i].x;
  71. if(map[bnewy][bnewx] == '#' || map[nby][nbx]=='O') break;
  72. nby = bnewy;
  73. nbx = bnewx;
  74. }
  75.  
  76. if(nry==nby && nrx==nbx) //빨간구슬 파란구슬 위치 같으면?
  77. {
  78. if(map[nby][nbx] == 'O') continue; //파란공이 구멍에 있으면
  79. if(abs(ry-nry)+abs(rx-nrx)>abs(by-nby)+abs(bx-nbx)) //red의 이동거리가 blue보다 크면
  80. {
  81. //red가 더 뒤에있던 거니까 뒤로 옮겨줌
  82. nry-=moveDir[i].y;
  83. nrx-=moveDir[i].x;
  84. }else{
  85. //blue가 더 뒤에있던 거니까 뒤로 옮겨줌
  86. nby-=moveDir[i].y;
  87. nbx-=moveDir[i].x;
  88. }
  89. }
  90.  
  91. if(visited[nry][nrx][nby][nbx]) continue;
  92. visited[nry][nrx][nby][nbx] = 1;
  93. q.push({nry, nrx, nby, nbx});
  94. }
  95. }
  96. if(cnt==10)
  97. {
  98. cnt = -1;
  99. return;
  100. }
  101. cnt++;
  102. }
  103. cnt = -1;
  104. return;
  105. }
  106.  
  107. int main() {
  108. // your code goes here
  109.  
  110.  
  111. cin >> n >> m;
  112. for(int i = 0 ; i < n ; i++)
  113. {
  114. for(int j = 0 ; j < m ; j++)
  115. {
  116. scanf("%1s", &map[i][j]);
  117. if(map[i][j] == 'B') //파란공
  118. {
  119. blue_y = i;
  120. blue_x = j;
  121. }
  122. else if(map[i][j] == 'R') //빨간공
  123. {
  124. red_y = i;
  125. red_x = j;
  126. }
  127. else if(map[i][j] == 'O') //구멍
  128. {
  129. whole_y = i;
  130. whole_x = j;
  131. }
  132. }
  133. }
  134.  
  135. visited[red_y][red_x][blue_y][blue_x] = 1; //방문표시
  136. q.push({red_y, red_x, blue_y, blue_x});
  137. bfs();
  138.  
  139. cout << cnt << endl;
  140. return 0;
  141. }
Success #stdin #stdout 0s 4260KB
stdin
5 5
#####
#..B#
#.#.#
#RO.#
#####
stdout
1