Algorithm/backjoon

[백준] 2178번 미로 탐색(python,c++)

유쾌한고등어 2023. 2. 14. 07:15

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

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

 


SOLUTION CODE

# PYTHON


from collections import deque

dy = (0, 1, 0, -1)
dx = (1, 0 ,-1, 0)

N,M = map(int,input().split())
board = [input() for _ in range(N)] # String으로 받음

def is_valid_coord(y,x):
    return 0<=y<N and 0<=x<M

def bfs():
    chk = [[False] * M for _ in range(N)]
    chk[0][0] = True
    dq = deque()
    dq.append(0,0,1)
    while dq:
        y, x, d= dq.popleft()
        
        if y == N-1 and x = M -1:
            return d
        
        nd = d+1
        for k in range(4):
            ny = y + dy[k]
            nx = x + dx[k]
            if is_valid_cood(ny,nx) and board[ny][nx] == '1' and not chk[ny][nx]:
                chk[ny][nx] = True
                dq.append((ny,nx,nd))


bfs()

# C++

#include <iostream>
#include <queue>
#define MAX 101

using namespace std;

int N,M;
int maze[MAX][MAX];
int visited[MAX][MAX];
int dist[MAX][MAX]; // 이동칸 수

int dy[4] = {0,1,0,-1};
int dx[4] ={1,0,-1,0};

queue<pair<int,int>> q;

void bfs(int start_x,int start_y){
    visited[start_x][start_y] = 1; //방문체크
    q.push(make_pair(start_x,start_y));
    dist[start_x][start_y]++;
    
    // 모든 좌표를 탐색할 때까지 반복
    while(!q.empty()){
        
        // queue 첫번째 좌표 꺼내기
        int x = q.front().first;
        int y = q.front().second;
        
        q.pop();
        
        for(int i=0;i<4;++i){
            
            int y_new = y+dy[i];
            int x_new = x+dx[i];
            
            // 유효범위+방문X+이동가능확인
            if((0<=x_new && x_new <N) && (0<=y_new && y_new < M)
            && !visited[x_new][y_new] && maze[x_new][y_new] ==1 )
            {
                visited[x_new][y_new] = 1; // 방문체크
                q.push(make_pair(x_new,y_new)); // 큐에 삽입
                dist[x_new][y_new] = dist[x][y] +1;
                
            }
        }
    }
}

int main() {
    cin >> N, M; // 미로크기
    
    for(int i=0;i<N;i++){
        String row;
        cin >> row; // ex_110111...
        
        for(int j=0;j<M;++j){ // 행별 좌표저장
            maze[i][j] = row[j] - '0'; //문자->숫자 변환
        }
    }
    
    bfs(0,0);
    
    cout<<dist[N-1][M-1];
}