본문 바로가기

알고리즘 풀이

백준 3187번 양치기 꿍

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


기본적인 bfs 문제이다. 생각나는 대로 짜서.. 효율적이지 않은 것 같다. 전역변수 막 쓰고 난리난듯


#include <iostream>
using namespace std;
char fence[251][251] = {0, };
bool visit[251][251] = {0, };
int row, col, sheep, wolf;
int dx[4] = {0, -1, 0, 1};
int dy[4] = {-1, 0, 1, 0};
bool isInner(int x, int y) {
return (x >= 0 && x < row && y >= 0 && y < col);
}
// v : 늑대, k : 양
void bfs(int x, int y) {
visit[x][y] = true;
if (fence[x][y] == 'k') {
sheep++;
} else if (fence[x][y] == 'v') {
wolf++;
}
for (int i = 0 ; i < 4; ++i) {
int newX = x + dx[i];
int newY = y + dy[i];
if (isInner(newX, newY) && fence[newX][newY] != '#' && !visit[newX][newY]) {
bfs(newX, newY);
}
}
}
void printVisit() {
for(int i = 0 ; i < row; ++i) {
for(int j = 0; j < col; ++j) {
cout << visit[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
int main()
{
int s = 0, w = 0;
scanf("%d %d", &row, &col);
for(int i = 0; i < row; ++i) {
scanf("%s", &fence[i]);
}
for(int i = 0 ; i < row; ++i) {
for(int j = 0; j < col; ++j) {
sheep = wolf = 0;
if (fence[i][j] != '#' && !visit[i][j]) {
bfs(i, j);
if (sheep != 0 || wolf != 0) {
if (wolf >= sheep) {
w += wolf;
} else {
s += sheep;
}
}
}
}
}
printf("%d %d", s, w);
return 0;
}