관리 메뉴

어읽로꾸거

BOJ 3187 양치기 꿍 본문

알고리즘

BOJ 3187 양치기 꿍

어읽로꾸거 2019. 9. 15. 10:12

링크

https://www.acmicpc.net/problem/3187

 

3187번: 양치기 꿍

문제 양치기 꿍은 맨날 늑대가 나타났다고 마을 사람들을 속였지만 이젠 더이상 마을 사람들이 속지 않는다. 화가 난 꿍은 복수심에 불타 아예 늑대들을 양들이 있는 울타리안에 마구 집어넣어 양들을 잡아먹게 했다. 하지만 양들은 보통 양들이 아니다. 같은 울타리 영역 안의 양들의 숫자가 늑대의 숫자보다 더 많을 경우 늑대가 전부 잡아먹힌다. 물론 그 외의 경우는 양이 전부 잡아먹히겠지만 말이다. 꿍은 워낙 똑똑했기 때문에 이들의 결과는 이미 알고있다. 만약 빈

www.acmicpc.net

풀이

구역별로 BFS를 돌리며 카운팅을 해줌!

코드

#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;

int r, c, r_v_c, r_k_c, t_v_c, t_k_c;
int xl[] = {0,0,-1,1};
int yl[] = {1,-1,0,0};
char map[250][250], visit[250][250];
queue < pair<int, int> > q;

int check(int x, int y){
	if(0<=x&&x<r&&0<=y&&y<c)
		return 1;
	return 0;
}

int main() {
	//freopen("input.txt","r",stdin);
	
	cin>>r>>c;
	getchar();
	for(int i=0;i<r;i++){
		for(int j=0;j<c;j++){
			scanf("%c",&map[i][j]);
		}
		getchar();
	}
			
			
	for(int i=0;i<r;i++){
		for(int j=0;j<c;j++){
			if(map[i][j]!='#'&&!visit[i][j]){
				t_v_c=t_k_c=0;
				q.push({i,j});
				visit[i][j] = 1;
				while(!q.empty()){
					int x = q.front().first;
					int y = q.front().second;
					q.pop();
					
					if(map[x][y]=='v')
						t_v_c++;
					if(map[x][y]=='k')
						t_k_c++;
					
					for(int ii=0;ii<4;ii++){
						int nx = x+xl[ii];
						int ny = y+yl[ii];
						if(check(nx,ny)&&map[nx][ny]!='#'&&!visit[nx][ny]){
							visit[nx][ny]=1;
							q.push({nx,ny});
						}
					}
				}
				if(t_v_c<t_k_c){
					r_k_c+=t_k_c;
				}
				else{
					r_v_c+=t_v_c;
				}
			}
		}
	}
	cout<<r_k_c<<" "<<r_v_c;
}

'알고리즘' 카테고리의 다른 글

BOJ 17281 ⚾(삼성 A형 기출)  (0) 2020.05.14
BOJ 15647 로스팅하는 엠마도 바리스타입니다  (0) 2019.09.19
BOJ 14613 너의 티어는?  (0) 2019.09.15
BOJ 1038 감소하는 수  (0) 2019.09.15
BOJ 17141 연구소 2  (0) 2019.09.13