[백준/boj] 2178번: 미로 탐색 | C++

2023. 12. 30. 00:15·백준 문제풀이
 

bfs 연습 문제!


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

 

2178번: 미로 탐색

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

www.acmicpc.net

문제풀이 핵심

 

bfs 는 먼저 도달한 값이 가장 최단거리 값이므로 같은 목적지에 두번 이상 방문할 것이라는 예외처리 필요없음.

이라는 부분을 인지하지 못해서 헷갈렸었다.

 

bfs를 잘 쓸 수 있는지가 관건!

 

그리고 사소한 거지만 

#define X first
#define Y second

여기에서는 땀흘리면 안되는데 땀흘려서 

X와 Y를 사용한 53-54번째 줄에서 expression result unused 에러가 났다 ㅋㅋ 이 부분도 땀 못봐서 좀 헤멘 부분이었다


문제풀이 코드

#include<iostream>
#include<algorithm> //fill 함수, utility 헤더도 포함됨 - pair 사용 
#include<queue>

using namespace std;
//거리같은 경우는 -1 등으로 따로 초기화 해주기 
//이중포문 or fill()  
int digst[102][102]; // 거리 저장할 배열

int board[102][102]; // 입력값 저장할 배열
int vis[102][102];

//define 뒤에는 땀흘리지말것
#define X first
#define Y second

int n,m;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    queue<pair<int,int>> Q; 
    int dx[4] = {1,0,-1,0};
    int dy[4] = {0,1,0,-1};

    cin >> n>>m;

    
    for(int i=0;i<n;i++){
        string a;
        cin >> a;
        
        for(int j=0;j<m;j++){
            int c = a[j] - '0'; //char -> int 해줄때 아스키코드 0 빼줄것 
            board[i][j] =c;

        }
        fill(digst[i],digst[i]+m,-1); //fill 함수를 이용한 값 초기화 

    }

    vis[0][0] =1;
    digst[0][0]=1;
    Q.push({0,0});

    while(!Q.empty()){
        pair<int,int> cur = Q.front();
        Q.pop();

        for(int i = 0; i<4; i++){
            int nx = cur.X + dx[i];
            int ny = cur.Y + dy[i];

            if(nx<0 || nx>=n || ny <0 || ny >=m) continue;
            if(vis[nx][ny] || board[nx][ny] != 1) continue;

            //bfs 는 먼저 도달한 값이 가장 최단거리 값이므로 같은 목적지에 두번 이상 방문할 것이라는 예외처리 필요없음
            digst[nx][ny] = digst[cur.X][cur.Y]+1;
            vis[nx][ny] = 1;
            Q.push({nx,ny});
        }
    }

    cout << digst[n-1][m-1];
    return 0;
}

 


로직 설명

그냥 bfs 알고리즘이다! 달달 외워서 숙지하는게 중요~~


 

문제풀이에 사용된 함수

algorithm 의 fill 함수와 pair

 

fill함수를 사용한 digst 초기화

for(int i=0;i<n;i++){
        string a;
        cin >> a;
        
        for(int j=0;j<m;j++){
            int c = a[j] - '0'; //char -> int 해줄때 아스키코드 0 빼줄것 
            board[i][j] =c;

        }
        fill(digst[i],digst[i]+m,-1); //fill 함수를 이용한 값 초기화 

    }

 

fill 함수 사용법 

fill(시작 주소, 종료 주소(=시작주소 +m), 초기화 할 값);

 

 

 

pair를 이용한 이중 배열 표현

    queue<pair<int,int>> Q;

 

pair 는  utility에 존재하지만 algorithm 에 utility가 포함되어있으므로 algorithm을 가져와서 사용함


실수 포인트

1. 입력을 문자열로 받고 char 를 int 로 고쳐야 함

-> 그냥 받아오면 48, 49(0,1의 아스키코드 값) 들이 가득 차있는 배열을 볼 수 있다

 

2. 따로 목적지에 대한 다중 방문에 대해 고려할 필요가 없다는 것!

 

3. 마지막 줄에 digst 목적지 값 출력할 때 

    cout << digst[n-1][m-1];

 

라는 것! n,m 으로 쓰면 안된다 . 당연하지만 ㅎ

 


 

마무리

실수도 실력이다! 실수 없애기!

'백준 문제풀이' 카테고리의 다른 글

[백준/boj] 1992번: 쿼드트리 | C++  (0) 2024.02.19
[백준/boj] 1012번: 유기농 배추 | C++  (1) 2024.01.07
[백준/boj] 2504번: 괄호의 값 | C++  (1) 2023.12.29
[백준/boj] 2493번: 탑 | C++  (3) 2023.12.24
[백준/boj] 2309번: 일곱 난쟁이 | C++  (0) 2023.12.19
'백준 문제풀이' 카테고리의 다른 글
  • [백준/boj] 1992번: 쿼드트리 | C++
  • [백준/boj] 1012번: 유기농 배추 | C++
  • [백준/boj] 2504번: 괄호의 값 | C++
  • [백준/boj] 2493번: 탑 | C++
c_jm
c_jm
  • c_jm
    c_jm
    c_jm

    🎋 어제보다 발전한 오늘

  • 전체
    오늘
    어제
    • 분류 전체보기 (36)
      • 프로젝트 (6)
      • 백준 문제풀이 (19)
      • 프로그래머스 문제풀이 (4)
      • 공부 (1)
      • 문제 해결 (2)
      • 기타 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    reverse proxy
    nginx
    docker-compose.yml
    복붙
    docker
    docker-compose
    jquery
    리버스 프록시 서버
    html
    리버스 프록시
    글자색
    인라인 css
    홈서버
    도커
    티스토리 다크모드
    백준 #1152 #c++
    코드블럭
    도커컴포즈
    다크모드
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
c_jm
[백준/boj] 2178번: 미로 탐색 | C++
상단으로

티스토리툴바