[BOJ] 1726번 로봇

Apr 11, 2019


https://www.acmicpc.net/problem/1726

3차원 큐와 배열을 능숙히 사용하실 줄 알면 충분히 푸실 수 있는 문제입니다.

저는 BFS를 사용하여 문제를 해결했고, 기존에 좌표만 생각하던 BFS문제처럼

방향과 전진크기를 고려하면서 BFS를 돌리면 쉽게 해결하실 수 있습니다.

ch[방향][x][y], 큐({방향,x,y})를 사용했습니다.

#include <iostream>
#include <queue>
using namespace std;
int m, n,map[101][101];
bool ch[4][101][101];
int sx, sy, sdir;//start
int ax, ay, adir;//arrive
int dx[] = { 0,0,0,1,-1 };
int dy[] = { 0,1,-1,0,0 };
struct Info {
    int dir;
    int x;
    int y;
};
queue <Info> q;
void bfs() {
    int cnt = 0;
    while (!q.empty()) {
        int size = q.size();//큐 크기만큼만 돌려줘서 depth 계산
        cnt++;
        for (int i = 0; i < size; i++) {
            int x = q.front().x;
            int y = q.front().y;
            int dir = q.front().dir;
            q.pop();
            if (x == ax && y == ay && dir == adir) {//도착
                cout << cnt-1;
                return;
            }
            int nx = x;
            int ny = y;
            for (int j = 0; j < 3; j++) {//전진
                nx += dx[dir];
                ny += dy[dir];
                if (nx > 0 && ny > 0 && nx <= m&&ny <= n && !ch[dir][nx][ny]) {
                    if (map[nx][ny] == 1) break;
                    ch[dir][nx][ny] = true;
                    q.push({ dir,nx,ny });
                }
            }
            if (dir == 1 || dir == 2) {//동or서->남북
                if (!ch[3][x][y]) {
                    q.push({ 3,x,y });
                    ch[3][x][y] = true;
                }
                if (!ch[4][x][y]) {
                    q.push({ 4,x,y });
                    ch[4][x][y] = true;
                }
            }
            else if (dir == 3 || dir == 4) {//남or북->동서
                if (!ch[1][x][y]) {
                    q.push({ 1,x,y });
                    ch[1][x][y] = true;
                }
                if (!ch[2][x][y]) {
                    q.push({ 2,x,y });
                    ch[2][x][y] = true;
                }
            }
        }
    }
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> m >> n;
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> map[i][j];
        }
    }
    cin >> sx >> sy >> sdir;
    cin >> ax >> ay >> adir;
    q.push({ sdir, sx, sy });//시작위치저장
    ch[sdir][sx][sy] = true;
    bfs();
}
  • 나 혼자 말하고 나 혼자 듣는 말

….