백준: Class 5 - 13460
</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>
댓글남기기