백준 13460. 구슬 탈출2 [실패]

알고리즘/백준 알고리즘

2020. 9. 8. 13:30

1.실패 원인

문제를 제대로 읽지 않았다. 아니 너무 대충 읽고 풀었다 흑흑.. 처음에는 파란 공을 먼저 넣는 것인줄 알고 삽질을 해버렸고.. 나중에는 답이 계속 이상하게 나와서 결국 포기했는데.. 공을 굴릴 때마다 한칸씩 움직이는게 아니라 직선상의 경로를 (벽을 만날때 까지) 한 번에 움직이는 것이었다. 나중에 나왔던 오답들을 비교해보니 한칸씩 움직인다는 전제하에 답이 맞았다.. 이게 무슨 멍청한 상황인지.. 떠먹여주는 문제를 풀지 못한 내가 한심하다 ㅜㅜ

 

2.작성 코드

#include <stdio.h>
#include <algorithm>
#include <queue>
using namespace std;
 
struct balls {
    int depth;
    int rx, ry, bx, by;
};
int irx, iry, ibx, iby, hx, hy;
 
int n, m, ans = -1;
int map[10][10];
int dir[4][2] = { {1,0},{0,1},{-1,0},{0,-1} };
bool visit[10][10][10][10];
char str[11];
 
void move(int& x, int& y, int d) {
    while (1) {
        x += dir[d][0]; y += dir[d][1];
        if (map[x][y] == 1) {
            x -= dir[d][0]; y -= dir[d][1];
            break;
        }
        else if (map[x][y] == 2)
            break;
    }
}
 
int main() {
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; ++i) {
        scanf("%s", str);
        for (int j = 0; j < m; ++j) {
            switch (str[j]) {
            case '.':
                map[i][j] = 0; break;
            case '#':
                map[i][j] = 1; break;
            case 'O':
                map[i][j] = 2; hx = i, hy = j; break;
            case 'R':
                irx = i, iry = j; break;
            case 'B':
                ibx = i, iby = j; break;
            }
        }
    }
 
    queue<balls> q;
    q.push({ 0,irx,iry,ibx,iby });
    visit[irx][iry][ibx][iby] = true;
 
    while (!q.empty()) {
        balls cur = q.front(); q.pop();
 
        if (cur.depth > 10)
            break;
        if (cur.rx == hx && cur.ry == hy) {
            ans = cur.depth;
            break;
        }
 
        for (int i = 0; i < 4; ++i) {
            int rx = cur.rx, ry = cur.ry;
            int bx = cur.bx, by = cur.by;
            move(rx, ry, i), move(bx, by, i);
 
            if (bx == hx && by == hy)
                continue;
 
            if (rx == bx && ry == by) {
                switch (i) {
                case 0:
                    cur.rx < cur.bx ? rx-- : bx--; break;
                case 2:
                    cur.rx < cur.bx ? bx++ : rx++; break;
                case 1:
                    cur.ry < cur.by ? ry-- : by--; break;
                case 3:
                    cur.ry < cur.by ? by++ : ry++; break;
                }
            }
 
            if (!visit[rx][ry][bx][by]) {
                balls next = { cur.depth + 1,rx,ry,bx,by };
                q.push(next);
                visit[rx][ry][bx][by] = true;
            }
        }
    }
 
    printf("%d", ans);
 
    return 0;
}

3.참고 코드

js1jj2sk3.tistory.com/105

 

백준) 13460 구슬 탈출 2 // 구 째로탈출2

구슬 탈출 2 보드에 빨간 공과 파란 공을 올려 두고, 보드를 4방향으로 기울여보면서 빨간 공을 보드의 구멍으로 탈출시키는게 목표다. 이 때 가장 적게 기울여보는 횟수는 얼마나 될까? https://www

js1jj2sk3.tistory.com

4. 해결 방안

어렸을 때부터 책읽기를 좋아하지 않아서 흔히 말하는 세줄요약이 아닌 장문의 글을 잘 읽지 못한다. 이게 문제 풀이로 이어질줄이야.. 그리고 계속 까먹는데 Dir을 배열로 만들어놓고 사용하는게 편하니 습관을 들여야겠다.

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

백준 2186. 문자판 [실패]  (0) 2020.09.01
백준 1525. 퍼즐 [실패]  (0) 2020.08.29
백준 9019. DSLR [실패]  (0) 2020.08.29
백준 1697. 숨바꼭질 [실패]  (0) 2020.08.27
백준 1963. 소수경로 [실패]  (0) 2020.08.27