반응형
1303번: 전쟁 - 전투
첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는
www.acmicpc.net
bfs기본 문제였습니다.
풀이방법
1. 설계 : W병사의 영역, B병사의 영역을 구해 각자 더한 후 출력합니다.
2. bfs실행 : queue를 시용합니다. 방문하지 않은 곳이 만약 같은 병사가 위치한 곳이라면 방문한 뒤 해당 병사의 명 수를 ++해줍니다. 그 후 그 부분을 다시방문해 다음 병사를 살펴봐야 하므로 해당 위치를 push 해줍니다. 영역의 크기를 다 셌다면 영역 넓이 * 영역 넓이 를 반환합니다. 이는 처음 bfs가 호출될 때 인자로 현재 위치 i,j를 인자로 넘겨주는데 이로써 더해줄 영역이 'W'인지 'B'인지 알 수 있습니다.
3. 정답 출력
Code
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
int dx[4] = {0,0,-1,1};
int dy[4] = {-1,1,0,0};
char board[101][101];
int visited[101][101];
int bPower,wPower,n,m;
int bfs(int i, int j){
int cnt = 1;
char c = board[i][j];
queue <pii> q;
q.push({i,j});
visited[i][j] = 1;
while(!q.empty()){
int x = q.front().first;
int y = q.front().second;
q.pop();
for(int i = 0 ; i < 4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(0 > nx || nx >= m || 0 > ny || ny >= n) continue;
if(visited[nx][ny] || board[nx][ny]!=c) continue;
visited[nx][ny] = 1;
cnt++;
q.push({nx,ny});
}
}
return cnt * cnt;
}
int main(){
cin >> n >> m;
for(int i = 0; i < m; i++)
cin >> board[i];
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(!visited[i][j]){
if(board[i][j] == 'W') wPower += bfs(i,j);
else bPower += bfs(i,j);
}
}
}
cout << wPower << ' ' << bPower <<'\n';
}
'Algorithm > BFS' 카테고리의 다른 글
(C++) - 백준(BOJ) 1926번 : 그림 (0) | 2021.03.13 |
---|---|
(C++) - 백준(BOJ) 3184번 : 양 (0) | 2021.03.13 |
(C++) - 백준(BOJ) 5567번 : 결혼식 (0) | 2021.03.12 |
(C++) - 프로그래머스(고득점 kit - (DFS/BFS)) : 네트워크 답 (0) | 2021.02.11 |
(C++) - 프로그래머스(2017 카카오 코드 예선) : 카카오프렌즈 컬러링북 (0) | 2020.12.27 |