백준: Class 5 - 13460

2 분 소요


</br> 클래스 5 계속
</br>

13460: 구슬 탈출 2

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


int righ(){
    int i, j, ii, jj;
    if( xy[0][1] < xy[1][1] ){
        i = xy[0][0]; j = xy[0][1];
        ii = xy[1][0]; jj = xy[1][1];
    }
    else{
        i = xy[1][0]; j = xy[1][1];
        ii = xy[0][0]; jj = xy[0][1];
    }

    stack<char> st;
    for( ; j < m-1; j++){
        if( st.size() && mmap[i][j] == '#' ) break;
        if( mmap[i][j] == 'A' || mmap[i][j] == 'B' ){
            st.push(mmap[i][j]);
            mmap[i][j] = '.';
        }
        if( st.size() && mmap[i][j] == 'O' ){
            if( st.top() == 'A' && st.size() == 1 ) return 1;
            else return -1;
        }
    }
    while( st.size() ){
        mmap[i][--j] = st.top();
        int k = mmap[i][j] - 'A';
        xy[k][0] = i;
        xy[k][1] = j;
        st.pop();
    }

    for( ; jj < m-1; jj++){
        if( st.size() && mmap[ii][jj] == '#' ) break;
        if( mmap[ii][jj] == 'A' || mmap[ii][jj] == 'B' ){
            st.push(mmap[ii][jj]);
            mmap[ii][jj] = '.';
        }
        if( st.size() && mmap[ii][jj] == 'O' ){
            if( st.top() == 'A' && st.size() == 1 ) return 1;
            else return -1;
        }
    }
    while( st.size() ){
        mmap[ii][--jj] = st.top();
        int k = mmap[ii][jj] - 'A';
        xy[k][0] = ii;
        xy[k][1] = jj;
        st.pop();
    }
    return 0;
}

void func(int prev, int d){
    if( dp[ xy[0][0]*m+xy[0][1] ][ xy[1][0]*m+xy[1][1] ] < d ) return;
    dp[ xy[0][0]*m+xy[0][1] ][ xy[1][0]*m+xy[1][1] ] = d;
    if( d == 11 || d > ans ) return;
    if( xy[1][0] ==  xy[2][0] && xy[1][1] == xy[2][1] ) return;
    if( xy[0][0] ==  xy[2][0] && xy[0][1] == xy[2][1] ){
        ans = min(ans, d);
        return;
    }

    int rx = xy[0][0], ry = xy[0][1];
    int bx = xy[1][0], by = xy[1][1];
    vector< vector<char> > t = mmap;
    if( prev != 0 ){
        int k = up();
        if( k == 1 ){
            ans = min(ans, d+1);
            mmap = t;
            xy[0][0] = rx;
            xy[0][1] = ry;
            xy[1][0] = bx;
            xy[1][1] = by;
            return;
        }
        else if( k == 0 ) func(0, d+1);
        mmap = t;
        xy[0][0] = rx;
        xy[0][1] = ry;
        xy[1][0] = bx;
        xy[1][1] = by;
    }
    if( prev != 1 ){
        // same
    }
    if( prev != 2 ){
        // same
    }
    if( prev != 3 ){
        // same
    }
}

피곤할 때 짜니까 코드가 더럽다
전 포스트인 (12100: 2048 (Easy), https://cyj893.github.io/algorithm/Algorithm17_12/)와 비슷하게 백트래킹 구현 문제다
잠결에 하니까 자꾸 ‘R’을 ‘A’라고 착각하고 코드를 써서… 그냥 입력 때 ‘A’로 저장했다. 그래서 xy[‘A’-‘A’][0], xy[‘A’-‘A’][1]에 A의 좌표, xy[‘B’-‘A’][0], xy[‘B’-‘A’][1]에 B의 좌표를 저장하는 식으로 인덱싱을 했다
만약 오른쪽으로 기울일 경우, A와 B 중 더 왼쪽에 있는 걸 먼저 잡고 스택으로 처리하며 오른쪽으로 옮긴다
그러다가 만약 ‘O’를 만날 경우 ‘A’와 ‘B’에 따라 처리해 준다
주의할 점 오른쪽으로 기울여서 A도 구멍에 빠지고 B도 그 후에 빠지면 실패인 경우로 침
</br>


지금 이걸 적는 시각은 8월 23일 오후 11시 53분
오늘 아침 Swift 수업을 처음 시작해서 준비한다고 일찍 일어났더니 조금 피곤하다
근데 생각했던 것 보다 훨씬 쉽고 친절하게 설명하셔서 좋다
물론 첫날이라 순한 맛이고 내일도 쉬울 지는 모름
이거 관련 포스트도 따로 써야지
</br>

댓글남기기