코딩 공부/백준

[백준][C++] 16954 움직이는 미로 탈출

김 정 환 2021. 3. 26. 19:02
반응형

www.acmicpc.net/problem/16954

 

16954번: 움직이는 미로 탈출

욱제는 학교 숙제로 크기가 8×8인 체스판에서 탈출하는 게임을 만들었다. 체스판의 모든 칸은 빈 칸 또는 벽 중 하나이다. 욱제의 캐릭터는 가장 왼쪽 아랫 칸에 있고, 이 캐릭터는 가장 오른쪽

www.acmicpc.net

 

 

 

알고리즘 종류

 

 

 

사고 과정

    1. 욱제를 9방향으로 움직인다.

    2. 벽을 내린다.

    

    - 고려해야할 상황은, 욱제가 벽을 피하기 위해서 이전 시간대에 갔던 위치를 다시 갈 수 있다. 따라서 방문을 체크하는 배열을 시간대에 따라 초기화해야 한다.

 

 

 

구현(C++)

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
#include <iostream> 
#include <cstring>
#include <queue>
 
using namespace std;
 
char mat[9][9];
int isVisited[9][9];
int dir[9][2= {{0,0}, {1,0}, {1,1}, {0,1}, {-1,1}, {-1,0}, {-1,-1}, {0,-1},{1,-1}};
 
 
bool isValid(int y, int x){
    return (y>=1 && y<=8&& (x>=1 && x<=8);
}
 
 
// 벽 내리기  
void down_walls(){
    for(int i=7; i>=0; i--){
        for(int j=1; j<=8; j++){
            mat[i+1][j] = mat[i][j];
        }
    }
}
 
 
bool bfs(){
    
    queue<pair<intint> > q;
    q.push({8,1});
    isVisited[8][1= 1;
    
    while(!q.empty()){
        memset(isVisited,0sizeof(isVisited)); // 벽을 피하기 위해서 이전에 갔던 자리를 다시 방문할 수 있다. 
        int size = q.size(); // 시간 단위로 수행  
        
        while(size--){
            int cy = q.front().first;
            int cx = q.front().second;
            q.pop();
            
            if(mat[cy][cx] == '#'continue// 욱제가 이동한 자리에 벽이 온 경우  
            
            for(int d=0; d<9; d++){
                int ny = cy + dir[d][0];
                int nx = cx + dir[d][1];
                
                if(ny==1 && nx==8return true// 목적지 도착  
                
                if(!isValid(ny, nx)) continue;
                if(mat[ny][nx] == '#'continue;
                if(isVisited[ny][nx]) continue;
                
                isVisited[ny][nx] = 1;
                q.push({ny, nx});
            }
        }
        
        down_walls();
    }
    
    return false;
}
 
 
int main(void){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    for(int i=1; i<=8; i++){
        for(int j=1; j<=8; j++){
            cin >> mat[i][j];
        }
    }
    for(int j=1; j<=8; j++) mat[0][j] = '.';
    
    if(bfs()) cout << 1 << endl;
    else cout << 0 << endl;
}
 
cs

 

 

 

시행착오

    - 시간대마다 방문을 체크하는 배열(isVisited)를 초기화 하지 못했서 제출이 안됬다. 왜인지 이전에 갔던 곳을 재방문할 수 있다고 생각은 해놓고 막상 구현은 하지 않은 나의 멍청함이 시간을 잡아먹었다. 시도해봤어야 했는데... 왜 그랬을까? 반성하고 다음에는 시도하자...!

반응형

'코딩 공부 > 백준' 카테고리의 다른 글

[백준][C++] 2307 도로검문  (0) 2021.03.27
[백준][C++] 16137 견우와 직녀  (0) 2021.03.27
[백준][C++] 16929 Two Dots  (0) 2021.03.26
[백준][C++] 2234 성곽  (0) 2021.03.24
[백준][C++] 5427 불  (0) 2021.03.23