백준 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