본문 바로가기
Programming/Algorithm

백준 1726 로봇

by OKOK 2018. 4. 2.

1. 현재의 방향에 대해서 갈 수 있는 것 넣기

2. 현재의 4방향에 대해서 돌리기


이렇게 2가지로 구분해서 하면 됩니다.

큐에 넣어도 됩니다. 많이 많이.


완전탐색을 하면 됩니다.

방향과 시간을 가지고 있으면 됩니다.


break 문을 잘 사용하도록 합니다.

처음에 안되면 바로 탈출합니다. continue 가 아닌 break!


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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
명령과 명령 2가 있습니다. 이에 대해 기능을 따로 추가해줍니다.
*/
 
#include <iostream>
#include <queue>
using namespace std;
#define SIZE 101 // 101;
#define qSIZE 130 // 130;
int map[SIZE][SIZE];
int visit[SIZE][SIZE][5];
 
int x, y, nx, ny;
struct point {
    int x, y, dir, cnt;
}que[qSIZE * qSIZE];
 
int rear, front;
int ans;
int M, N;
int dx[] = { 0,0,0,1,-1 };
int dy[] = { 0,1,-1,0,0 };
int startX, startY, endX, endY, startDir, endDir;
int dir, cnt;
 
void problemIn() {
    cin >> M >> N;
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < N; j++) {
            cin >> map[i][j];
        }
    }
 
    cin >> startX >> startY >> startDir;
    cin >> endX >> endY >> endDir;
    startX -= 1;
    startY -= 1;
    endX -= 1;
    endY -= 1;
}
 
void bfs() {
 
    while (rear != front) {
        front++;
        x = que[front].x;
        y = que[front].y;
        cnt = que[front].cnt;
        dir = que[front].dir;
 
        if (x == endX && y == endY && dir == endDir) {
            ans = cnt;
            return;
        }
 
        // 방향은 정해져 있음
        for (int i = 1; i <= 3; i++) {
            nx = x + dx[dir] * i;
            ny = y + dy[dir] * i;
            if (nx < 0 || ny < 0 || nx >= M || ny >= N) break;
            if (map[nx][ny] == 1break;
            if (visit[nx][ny][dir] == 0) {
                visit[nx][ny][dir] = 1;
                rear++;
                que[rear].x = nx;
                que[rear].y = ny;
                que[rear].dir = dir;
                que[rear].cnt = cnt + 1;
            }
        }
 
        // 현재 들은 것의 다른 방향에 대해서도 que 에 넣겠음
        for (int i = 1; i < 5; i++) {
            if (visit[x][y][i] == 0) {
                visit[x][y][i] = 1;
                rear++;
                que[rear].x = x;
                que[rear].y = y;
                que[rear].dir = i;
                if (dir == 1) {
                    if (i == 2) que[rear].cnt = cnt + 2
                    else que[rear].cnt = cnt + 1;
                }
                else if (dir == 2) {
                    if (i == 1) que[rear].cnt = cnt + 2;
                    else que[rear].cnt = cnt + 1;
                }
                else if (dir == 3) {
                    if (i == 4) que[rear].cnt = cnt + 2
                    else que[rear].cnt = cnt + 1;
 
                }
                else if (dir == 4) {
                    if (i == 3) que[rear].cnt = cnt + 2;
                    else que[rear].cnt = cnt + 1;
                }
            }
        }
    }
}
 
 
 
void solve() {
 
    front = rear = -1;
    rear++;
    que[rear].x = startX;
    que[rear].y = startY;
    que[rear].dir = startDir;
    que[rear].cnt = 0;
    visit[startX][startY][startDir] = 1;
    bfs();
 
}
 
int main() {
    problemIn();
    solve();
    cout << ans << endl;
    return 0;
}
cs