출처: https://3months.tistory.com/307 [Deep Play]

백준/DFS,BFS

[BOJ] 3109 빵집

코딩하는 랄뚜기 2022. 2. 4. 21:56

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

 

3109번: 빵집

유명한 제빵사 김원웅은 빵집을 운영하고 있다. 원웅이의 빵집은 글로벌 재정 위기를 피해가지 못했고, 결국 심각한 재정 위기에 빠졌다. 원웅이는 지출을 줄이고자 여기저기 지출을 살펴보던

www.acmicpc.net

 

처음에는 dfs로 풀지 않고 반복문을 돌렸다.

열을 먼저 탐색하면서 오른쪽 대각선 위, 오른쪽, 오른쪽 대각선 아래를 방문할 수 있는지 없는지 확인하고 방문할 수 있다면 check표시를 해주고 check표시가 된 경우에만 탐색을 할 수 있도록 구현하였는데 틀렸다. 반례가 있는거 같은데 못찾겠어서 그냥 모든 열 마다 dfs를 돌렸다. 

 

dfs를 돌릴 때 한 번 방문한 점은 다시 방문할 필요가 없다는 것을 주의해야 한다.

 

#include <string>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <stack>
#include <climits>

#define endl '\n'
#define ll long long

using namespace std;

char map_[10000][500];
bool visit[10000][500];
int R,C;

int d[]={-1,0,1};

void input() {
    cin>>R>>C;
    for(int i=0;i<R;i++)
        for(int j=0;j<C;j++){
            cin>>map_[i][j];
            //if(map_[i][j]=='x') check[i][j]=-1;
        }
}

void init() {
    //for(int i=0;i<R;i++) check[i][0]=1;
}

bool dfs(int i,int j){
    if(j==C-1) return true;
    
    for(int y=0;y<3;y++){
        int ny=i+d[y],nx=j+1;
        if(0<=ny&&ny<R&&map_[ny][nx]=='.'&&!visit[ny][nx]){
            visit[ny][nx]=true;
            bool flag=dfs(ny,nx);
            
            if(flag) return flag;
        }
    }
    return false;
}


int solution() {
    int ans=0;
    for(int i=0;i<R;i++){
        if(dfs(i,0)) ans++;
    }
    return ans;
}

int main()
{
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    input();
    cout<<solution();
    return 0;
}

'백준 > DFS,BFS' 카테고리의 다른 글

[BOJ] 24542 튜터-튜티 관계의 수  (0) 2022.02.28
[BOJ] 24545 Y  (0) 2022.02.28
[BOJ] 1987 알파벳  (0) 2022.02.03
[BOJ] 13023 ABCDE  (0) 2021.09.06
[BOJ] 벽 부수고 이동하기 4  (0) 2021.08.30