[BOJ] 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