본문 바로가기

baekjoon

1261번 알고스팟

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

 

1261번: 알고스팟

첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미

www.acmicpc.net

bfs + 최단경로 문제이다.

벽을 부수면 비용이 1씩 추가되고 안 부수면 비용이 없다. 따라서 다음과 같이 해주면 된다.

if(다음 경로가 == 1)  다음경로의 비용 > 현재 경로의 비용 + 1

else if(다음경로가 == 0) 다음경로의 비용 > 현재 경로의 비용

 

 

#include <bits/stdc++.h>
#define all(v) v.begin(), v.end()
#define INF 2e9
#define F first
#define S second
using namespace std;

typedef long long l;
typedef pair<int,int> p;
typedef tuple<int,int,int> tu;
typedef vector<int> vc;

int n,m,board[101][101],dx[] = {1,-1,0,0},dy[] = {0,0,1,-1},dist[101][101];
bool check[101][101];
string temp;

int bfs(int x,int y){

    dist[x][y] = 0;
    queue<p> q;
    q.push({x,y});

    while(!q.empty()){

        p cur = q.front();q.pop();

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

            if(nx < 0 || ny < 0 || nx >= n || ny >= m) continue;

            if(board[nx][ny] == 1){
                if(dist[nx][ny] > dist[cur.F][cur.S] + 1){
                    dist[nx][ny] = dist[cur.F][cur.S] + 1;
                    q.push({nx,ny});
                }

            }
            else if(board[nx][ny] == 0){
                if(dist[nx][ny] > dist[cur.F][cur.S]){
                    dist[nx][ny] = dist[cur.F][cur.S];
                    q.push({nx,ny});
                }
            }
        }
    }
    return dist[n-1][m-1];
}

int main() {
    ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);

    cin >> m >> n;

    for(int i=0;i<n;i++){
        cin >> temp;

        for(int j=0;j<m;j++){
            board[i][j] = temp[j] - '0';
            dist[i][j] = INF;
        }
    }

    cout << bfs(0,0);

}

'baekjoon' 카테고리의 다른 글

5639번 이진 검색 트리  (0) 2022.05.02
4485번 녹색 옷 입은 애가 젤다지?  (0) 2022.04.25
3197번 백조의 호수  (0) 2022.04.21
1043번 거짓말  (0) 2022.04.19
1395번 스위치  (0) 2022.04.17