본문 바로가기
IT/BOJ

백준(BOJ) 2665 미로만들기 *

by 빨강자몽 2019. 3. 13.

# BFS


어렵지않은 BFS 문제이다.


유의해야 할 점은 방문한 칸에 대한 값 저장만 잘 해주면 될 듯!


#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#define MAX 55
#define INF 2123456789

using namespace std;
typedef long long ll;
typedef pair<int,int> pi;

// p는 좌표값, black은 화이트로 만든 칸의 갯수
struct st{
    pi p;
    int black=0;
};

int n;
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
// map은 입력 받아 온것 , visit은 해당 좌표까지 오는데 black의 최소 값
int map[MAX][MAX],visit[MAX][MAX];
char str[MAX];
queue<st> q;

int main() {

    // 초기 map을 모두 -1로 설정한다.
    fill_n(&map[0][0],MAX*MAX,-1);
    fill_n(&visit[0][0],MAX*MAX,INF);

    // 입력받아온다.
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        scanf("%s",str);
        for (int j = 1;j <=n; j++) {
            map[i][j] = str[j - 1] - '0';
        }
    }

    // 시작지점 넣어준다.
    st s = {{1,1},0};
    q.push(s);

    // bfs를 돌려준다.
    while(!q.empty()){
        s = q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            int y = s.p.first+dy[i], x =s.p.second+dx[i];

            // 0 or 1만 방문해준다.
            if(map[y][x]==-1)
                continue;

            // 이동하려는 칸이 흰색인 경우.
            if(map[y][x]==1&&visit[y][x]>s.black){
                visit[y][x]=s.black;
                q.push({{y,x},s.black});
            }

            // 이동하려는 칸이 검은색인 경우.
            if(map[y][x]==0&&visit[y][x]>(s.black+1)){
                visit[y][x]=s.black+1;
                q.push({{y,x},s.black+1});
            }
        }
    }

    // 결과값을 출력해준다.
    printf("%d",visit[n][n]);
    return 0;
}


'IT > BOJ' 카테고리의 다른 글

백준(BOJ) 2870 수학숙제 *  (0) 2019.03.17
백준(BOJ) 2667 단지번호붙이기 *  (0) 2019.03.14
백준(BOJ) 16189 Repetitive Palindrome *  (0) 2018.10.07
백준(BOJ) 16190 Rising Sun **  (0) 2018.10.07
백준(BOJ) 16192 Voronoi Diagram Returns *  (0) 2018.10.07