BOJ 6087 레이저 통신

2020. 12. 2. 20:53·알고리즘/BOJ

www.acmicpc.net/problem/6087

 

6087번: 레이저 통신

크기가 1×1인 정사각형으로 나누어진 W×H 크기의 지도가 있다. 지도의 각 칸은 빈 칸이거나 벽이며, 두 칸은 'C'로 표시되어 있는 칸이다. 'C'로 표시되어 있는 두 칸을 레이저로 통신하기 위해서

www.acmicpc.net

 

BFS를 하면서 회전이 총 몇 번 일어났는지 체크해주면 되는데

처음엔 방향 dir 벡터를 선언하고 그 방향과 다르면 +1 해주는 식으로 접근했다가

더 좋은 풀이가 보여서 참고했다.

 

결국 일직선으로 얼마나 갈 수 있는지를 확인하는 게 중요한데

BFS로 범위를 체크하는 부분에서 while문을 사용해서 범위가 끝날 때까지 직진하도록 한다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
 
struct P { int x, y; };
int n, m;
int vis[101][101];
char a[101][101];
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };
vector<P> node;
queue<P> q;
 
int bfs(int x, int y) {
    vis[x][y] = 0;
    q.push({ x,y });
 
    while (!q.empty()) {
        P cur = q.front(); q.pop();    
        if (cur.x == node[1].x && cur.y == node[1].y) return vis[cur.x][cur.y] - 1;
        for (int i = 0; i < 4; ++i) {
            int nx = cur.x + dx[i];
            int ny = cur.y + dy[i];
            while (nx >= 0 && nx < n && ny >= 0 && ny < m) {
                if (a[nx][ny] == '*') break;
                if (!vis[nx][ny]) {
                    vis[nx][ny] = vis[cur.x][cur.y] + 1;
                    q.push({ nx,ny });
                }
                nx += dx[i];
                ny += dy[i];
            }
        }
    }
}
 
int main() {
    ios::sync_with_stdio(false); cin.tie(0);
 
    cin >> m >> n;
    for (int i=0;i<n;++i)
        for (int j = 0; j < m; ++j) {
            cin >> a[i][j];
            if (a[i][j] == 'C') node.push_back({ i,j });
        }
 
    cout << bfs(node[0].x, node[0].y) << endl;
 
    return 0;
}
Colored by Color Scripter
cs

 

그 외에는 딱히 어려울 것이 없었다.

'알고리즘 > BOJ' 카테고리의 다른 글

BOJ 11066 파일 합치기  (0) 2020.12.05
BOJ 10164 격자상의 경로  (0) 2020.12.03
BOJ 14442 벽 부수고 이동하기 2  (0) 2020.12.02
BOJ 3197 백조의 호수  (0) 2020.12.01
BOJ 1517 버블 소트  (0) 2020.11.26
'알고리즘/BOJ' 카테고리의 다른 글
  • BOJ 11066 파일 합치기
  • BOJ 10164 격자상의 경로
  • BOJ 14442 벽 부수고 이동하기 2
  • BOJ 3197 백조의 호수
khyu2
khyu2
  • khyu2
    dev log
    khyu2
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘
        • BOJ
        • Programmers
        • Algorithm
        • SWEA
      • 개발
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    팰린드롬
    이분 탐색
    우선순위 큐
    이분탐색
    큐
    조합
    피사노 주기
    소수
    dp
    코딩테스트 연습
    SWEA
    크루스칼
    프로그래머스
    냅색
    행렬 제곱
    GREEDY
    트리
    BFS
    피보나치 수
    다익스트라
    유니온 파인드
    BOJ
    dfs
    완전 탐색
    알고리즘
    MST
    구현
    시뮬레이션
    분할 정복
    완전탐색
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
khyu2
BOJ 6087 레이저 통신
상단으로

티스토리툴바