이 문제는 BFS로 서로 연결되어 있는 병사의 인원 수를 구하여 (인원 수 * 인원 수)를 sum에 추가해준 다음
출력해주면 되는 간단한 문제입니다.
BFS를 2번 해서 쓰는데 함수를 만들어서 재사용을 하여도 되고 IF문에 조건을 변수로 넣어
하나의 BFS코드에 변수 값만 바꿔서 할 수도 있지만
귀찮기 때문에!! 그냥 컨트롤 CV 해버렸습니다.ㅠㅠ
#include <iostream>
#include <queue>
using namespace std;
char board[101][101];
int vis[101][101] = {0,};
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
queue<pair<int,int>> Q;
int main() {
int sum = 0, sum2 = 0;
int n, m;
cin >> m >> n;
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++){
cin >> board[i][j];
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(vis[i][j] == 1){
continue;
}
int c = 1;
Q.push({i,j});
vis[i][j] = 1;
if(board[i][j] == 'W'){
while(!Q.empty()){
pair<int,int> cur = Q.front(); Q.pop();
for(int i = 0; i < 4; i++){
int nx = cur.first + dx[i];
int ny = cur.second + dy[i];
if((nx < 0 || nx >= n) || (ny < 0 || ny >= m)) continue;
if((board[nx][ny] == 'B') || (vis[nx][ny] == 1)) continue;
Q.push({nx,ny});
vis[nx][ny] = 1;
c++;
}
}
sum += c * c;
}
else {
while(!Q.empty()){
pair<int,int> cur = Q.front(); Q.pop();
for(int i = 0; i < 4; i++){
int nx = cur.first + dx[i];
int ny = cur.second + dy[i];
if((nx < 0 || nx >= n) || (ny < 0 || ny >= m)) continue;
if((board[nx][ny] == 'W') || (vis[nx][ny] == 1)) continue;
Q.push({nx,ny});
vis[nx][ny] = 1;
c++;
}
}
sum2 += c * c;
}
}
}
cout << sum << " " << sum2;
}
'개발 > 알고리즘' 카테고리의 다른 글
백준 1074 (실버 1) 분할 정복 재귀 (0) | 2024.05.07 |
---|---|
백준 7576 (골드 5) BFS (1) | 2024.04.21 |
BFS 백준-2178 미로탐색 (실버 1) (0) | 2024.04.21 |
2024-04-20 앳코더 (A,B,C) (0) | 2024.04.21 |
백준-6189 (골드 5) 옥상 정원 꾸미기 STACK (2) | 2024.04.18 |