본문 바로가기

개발/알고리즘

백준 1303 (실버 1) BFS

이 문제는 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;
	
}