[BOJ] 16920 : 확장 게임

16920 : 확장 게임

풀이

BFS

코드

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
//0:빈칸 -1:벽 1~9:각플레이어의 영역
int d[1000][1000];
int arr[1000][1000];

int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
//각플레이어의 마지막 확장 좌표
queue<pair<int,int>> q[10];
//확장 좌표 예비등록용
queue<pair<int,int>> q2[10];

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int i,j;
    //n:세로 m:가로 p:플레이어의수(최대9)
    int n,m,p;
    cin>>n>>m>>p;
    //각플레이어가 확장하는 영역크기
    int s[10]={0};
    //각플레이어의 영역수
    int answer[10]={0};
    
    pair<int,int> pa;
    for(i=1;i<=p;i++){
        cin>>s[i];
    }
    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            char tmp;
            cin>>tmp;
            if(tmp=='.'){
                arr[i][j]=0;
            }else if(tmp=='#'){
                arr[i][j]=-1;
            }else{
                arr[i][j]=tmp-'0';
                q[arr[i][j]].push({i,j});
            }
        }
    }
    
    //확장진행
    while(1){
        bool ok = false;
        for(int k=1;k<=p;k++){
            memset(d,0,sizeof(d));
            while(!q[k].empty()){
                ok= true;
                pa = q[k].front();
                q[k].pop();
                
                i=pa.first;
                j=pa.second;
                
                if(d[i][j] == s[k]){
                    q2[k].push({i,j});
                }
                if(d[i][j] > s[k]){
                    break;
                }
                if(arr[i][j] > 0 && arr[i][j] != k){
                    continue;
                }
                for(int dir = 0;dir<4;dir++){
                    int nx = i+dx[dir];
                    int ny = j+dy[dir];
                    if(0<=nx && nx<n && 0<=ny && ny < m){
                        if(arr[nx][ny] == 0){
                            d[nx][ny] = d[i][j] + 1;
                            if(d[nx][ny] <= s[k]){
                                arr[nx][ny] = k;
                                q[k].push({nx,ny});
                            }
                        }
                    }
                }
            }
            q[k] = q2[k];
            q2[k] = queue<pair<int,int>>();
            }
//        for(i=0;i<n;i++){
//            for(j=0;j<m;j++){
//                cout<<arr[i][j];
//            }
//            cout<<'\n';
//        }
//        cout<<'\n';
        
            if(!ok)
                break;
    }
    

    
    //최종 각플레이어의 영역 수 계산 후 출력
    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            answer[arr[i][j]]++;
        }
    }
    
    for(i=1;i<=p;i++){
        cout<<answer[i]<<' ';
    }
}

Written on April 13, 2019