본문 바로가기

Problem/BFS

[C/C++] BOJ 1726 :: 로봇

BOJ 1726 :: 로봇




문제 링크 : https://www.acmicpc.net/problem/1726






나레기ㅠㅠㅠㅠ 왜이렇게 성급한거야 진짜!!!


틀렸습니다를 두 번 경험한 후, 맞았습니다! 가 나옴...



내가 틀렸던 이유


1) 문제 정독 X

로봇을 모든 방향 다 회전시킬 수 있는 건 줄 알고 코딩하였다..


2) 잘못된 조건문 처리

이미 방문했을 때 => 그 방향의 다음 칸으로 넘어갈 수 있기 때문에 continue 해야 한다.

궤도가 없을 때 => 그 방향의 다음 칸으로 넘어갈 수 없기 때문에 break 해야 한다.





나의 코드




Github : https://github.com/j2wooooo/Daliy_Algorithms/blob/master/Daliy_Algorithms/BOJ_1726/BOJ_1726.cpp




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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// 백준알고리즘 1726번 :: 로봇
#include<iostream>
#include<queue>
using namespace std;
 
int M, N, ans;
int startx, starty, startdir, destx, desty, destdir;
// 로봇의 x좌표, y좌표, 방향
queue <pair<pair<intint>int>> robot;
int visited[101][101][5];
int factory[101][101];
 
// 동, 서, 남, 북
int dx[4= {001-1};
int dy[4= {1-100};
 
int bfs()
{
    int count = 0;
    while (!robot.empty())
    {
        int qsz = robot.size();
 
        while (qsz--)
        {
            int x = robot.front().first.first;
            int y = robot.front().first.second;
            int d = robot.front().second;
            robot.pop();
 
            if (x == destx && y == desty && d == destdir) return count;
 
            // d 방향으로 최대 3칸까지 갈 수 있다.
            int mx = x + dx[d-1];
            int my = y + dy[d-1];
            int md = d;
            int k = 3;
 
            while (k > 0)
            {
                if (mx < 1 || mx > M || my < 1 || my > N) break;
                if (factory[mx][my] == 1break;
                if (!visited[mx][my][md]) {
                    visited[mx][my][md] = 1;
                    robot.push(make_pair(make_pair(mx, my), md));
                }
                mx += dx[d-1];
                my += dy[d-1];
                k--;
            }
 
            if (d <= 2) md = 3;
            else md = 1;
 
            // 왼쪽/오른쪽 2 방향으로 회전할 수 있다.
            for (int i = 0; i < 2; i++)
            {
                mx = x;
                my = y;
                md += i;
 
                if (visited[mx][my][md]) continue;
                visited[mx][my][md] = 1;
                robot.push(make_pair(make_pair(mx, my), md));
            }
        }
        count++;
    }
    return count;
}
 
int main()
{
    cin >> M >> N;
 
    for (int i = 1; i <= M; i++)
    {
        for (int j = 1; j <= N; j++)
        {
            cin >> factory[i][j];
        }
    }
 
    cin >> startx >> starty >> startdir;
    robot.push(make_pair(make_pair(startx, starty), startdir));
    visited[startx][starty][startdir] = 1;
 
    cin >> destx >> desty >> destdir;
 
    ans = bfs();
 
    cout << ans;
 
    return 0;
}
cs


'Problem > BFS' 카테고리의 다른 글

[C/C++] BOJ 3055 :: 탈출  (0) 2019.02.12
[C/C++] BOJ 1113 :: 수영장 만들기  (0) 2019.02.08
[C/C++] BOJ 10026 :: 적록색약  (0) 2019.02.06
[C/C++] BOJ 14923 :: 미로 탈출  (0) 2019.01.24
[C/C++] BOJ 3184 :: 양  (0) 2019.01.23