My Profile

김형훈

안녕하세요.
김형훈입니다.

백준 16920 확장 게임

백준 16920 확장 게임

2022년 12월 5일

2022년 12월 5일

cpp, 탐색

문제

문제

풀이

풀이

이미 확장이 이루어진 영역은 더 이상 확장이 이루어지지 않는다.
따라서 새로 확장된 영역에 대해서 만 다음 차례에 확장을 해주면 시간을 단축할 수 있다.

코드

코드

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

int n,m,p;
int s[12];
int ans[12];
// 플레이어별 확장을 진행할 영역
queue<pair<int,int>> target[12];
char board[1002][1002];
int dx[4] = {-1,0,1,0};
int dy[4] = {0,-1,0,1};

void expand(int player){
    // 위치, 이동 횟수
    queue<tuple<int,int,int>> q;
    while(!target[player].empty()){
        auto cur = target[player].front(); target[player].pop();
        q.push({cur.first,cur.second,0});
    }
    while(!q.empty()){
        auto [x,y,cnt] = q.front(); q.pop();
        for(int dir=0; dir<4; ++dir){
            int nx = x + dx[dir];
            int ny = y + dy[dir];
            if(nx<0 || ny<0 || nx>=n || ny>=m) continue;
            if(board[nx][ny] != '.') continue;
            board[nx][ny] = player+'0';
            target[player].push({nx,ny});
            // 확장 가능한 수 만큼 확장
            if(cnt+1 < s[player]) q.push({nx,ny,cnt+1});
        }
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m >> p;
    for(int i=1; i<=p; ++i) cin >> s[i];
    for(int i=0; i<n; ++i)
        for(int j=0; j<m; ++j){
            cin >> board[i][j];
            if(board[i][j] >= '1' && board[i][j] <= '9')
                target[board[i][j] - '0'].push({i,j});
    }
    bool isRemain = true;
    while(isRemain){
        // 1번 플레이어부터 차례로 확장
        for(int i=1; i<=p; ++i) expand(i);
        // 확장할 수 있는 성이 있으면 계속 진행
        isRemain = false;
        for(int i=1; i<=p; ++i)
            if(!target[i].empty()) isRemain = true;
    }
    for(int i=0; i<n; ++i)
        for(int j=0; j<m; ++j)
            if(board[i][j] >= '1' && board[i][j] <= '9')
                ans[board[i][j] - '0']++;
    for(int i=1; i<=p; ++i)
        cout << ans[i] << ' ';
}

결과

결과

Copyright © 2024 Hyunghoon Kim