티스토리 뷰

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

 

2638번: 치즈

첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5≤N, M≤100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로 표

www.acmicpc.net

DFS를 응용해서 풀이하였습니다.

치즈와 외부 공기의 접촉면을 구해야하기 때문에 맵의 네 모서리에서 BFS를 수행했습니다.

 

1. 현재 위치 (x,y)의 인접 위치(nx,ny)가 1이라면 2로 변경

2.현재 위치 (x,y)의 인접 위치(nx,ny)가 2이라면(다른 위치의 공기와 맞닿아 있고, 현재 위치와도 맞닿는 부분) 다음 루프에서 사라짐

3. 현재 위치 (x,y)의 인접 위치(nx,ny)가 0 이라면 dfs(nx,ny)수행

 

사라지는 치즈가 없을 때 까지 DFS를 반복하면 답을 구할 수 있습니다.


C++ 소스 코드

#include <iostream>
#include <cstring>
#define MAX 101
using namespace std;
int maps[MAX][MAX],tmp[MAX][MAX],n,m;
bool ck,visit[MAX][MAX];
const int dx[] = {-1,1,0,0}, dy[]={0,0,-1,1};
void dfs(int x, int y){
    if(visit[x][y]) return;
    visit[x][y] = true;
    for(int k=0;k<4;k++){
        int nx=x+dx[k],ny=y+dy[k];
        if(nx < 0 || nx >=n || ny <0 || ny >=m )continue;
        if (visit[nx][ny]) continue;
        if(maps[nx][ny]==2){
            tmp[nx][ny]=0;
            ck = true;
        }else if (maps[nx][ny]==1){
            maps[nx][ny]=2;
        }else dfs(nx,ny);
    }
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin >> n >> m;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin >> maps[i][j];
        }
    }
    memcpy(tmp,maps,sizeof(maps));
    for(int time=0;;time++){
        ck = false;
        dfs(0,0);
        dfs(0,m-1);
        dfs(n-1,0);
        dfs(n-1,m-1);
        memcpy(maps,tmp,sizeof(maps));
        fill(&visit[0][0],&visit[n][m]+1,0);
        if(!ck) {
            cout << time << '\n';
            break;
        }
    }
    return 0;
}

 

'Algorithm > 알고리즘 문제풀이' 카테고리의 다른 글

BOJ) 4485 - 녹색 옷 입은 애가 젤다지?  (0) 2020.12.16
BOJ) 1065 - 한수  (0) 2020.12.02
BOJ) 14676 - 영우는 사기꾼?  (0) 2020.11.25
BOJ) 1325 - 효율적인 해킹  (0) 2020.11.23
BOJ) 11728 - 배열 합치기  (0) 2020.11.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/10   »
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
글 보관함