지뢰찾기 C++ - 백준 9082

김관중·2024년 3월 17일
0

백준

목록 보기
86/129

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

문제 접근

지뢰의 배치는 확정되어 있기 때문에 확정된 위치를 큐에 넣고 bfs 돌려주었다.

확정된 위치 란 0이거나 3 또는 지뢰가 다 결정된 경우를 말한다.

기준을 가볍게 숫자가 낮을 때만 고르는 그리디적인 방식을 사용해도 통과했다.

코드는 다음과 같다.

#include <bits/stdc++.h>
using namespace std;

void solve(){
    bool f[100]={0,};
    bool vis[100]={0,};
    char c;
    int n,s=0,mini=3,cnt,dx[]={-1,0,1},ans=0;
    cin >> n;
    vector<int> arr(n);
    for(int i=0;i<n;i++){
        cin >> c; arr[i]=c-'0';
        if(arr[i]<mini){s=i;mini=arr[i];}
    }
    for(int i=0;i<n;i++){
        cin >> c;
        if(c=='*'){
            f[i]=1;
            ans++;
            for(int j=0;j<3;j++){
                if(n<=i+dx[j] || i+dx[j]<0) continue;
                arr[i+dx[j]]--;
            }
            if(arr[i]<mini){s=i;mini=arr[i];}
        }
    }
    queue<int> q;
    q.push(s);
    while(!q.empty()){
        int now=q.front(); q.pop(); vis[now]=true;
        for(int i=0;i<arr[now];i++){
            for(int j=0;j<3;j++){
                if(n<=now+dx[j] || now+dx[j]<0) continue;
                if(!f[now+dx[j]]){
                    bool b=true;
                    for(int l=0;l<3;l++){
                        if(n<=now+dx[j]+dx[l] || now+dx[j]+dx[l]<0) continue;
                        if(arr[now+dx[j]+dx[l]]==0) b=false;
                    }
                    if(b){
                        ans++;
                        f[now+dx[j]]=1;
                        for(int k=0;k<3;k++){
                            if(n<=now+dx[j]+dx[k] || now+dx[j]+dx[k]<0) continue;
                            arr[now+dx[j]+dx[k]]--;
                        }
                        break;
                    }
                }
            }
        }
        for(int i=0;i<3;i++){
            if(n<=now+dx[i] || now+dx[i]<0) continue;
            if(!vis[now+dx[i]]) q.push(now+dx[i]);
        }
    }
    cout << ans << '\n';
}

int main(){
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    int t; cin >> t;
    while(t--) solve();
    return 0;
}
profile
꾸준히 학습하기

0개의 댓글

관련 채용 정보