거북이의 IT 공부

[백준 1926] 그림 - C++ / 알고리즘 BFS, 플러드 필 본문

Baekjoon

[백준 1926] 그림 - C++ / 알고리즘 BFS, 플러드 필

버니빈 2020. 4. 15. 17:39

문제

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

 

1926번: 그림

어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로로 연결된 것은 연결이 된 것이고 대각선으로 연결이 된 것은 떨어진 그림이다. 그림의 넓이란 그림에 포함된 1의 개수이다.

www.acmicpc.net

나의 코드

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

queue<pair<int, int> > q;
vector<int> draw[500];
int direct[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
int n, m;
int number = 0;

//최대 넓이 반환
int breadth_first_search() {
	int max_area = 0;

	for (int y = 0; y < n; y++)
		for (int x = 0; x < m; x++) {
			if (draw[y][x] == 1) {
				number++;
				int area = 1;
				q.push(make_pair(x, y));
				draw[y][x] = -1; //들른 곳
				
				while (!q.empty()) {
					pair<int, int> now = q.front();
					q.pop();

					for (int i = 0; i < 4; i++) {
						pair<int, int> next = make_pair(now.first + direct[i][0], now.second + direct[i][1]);
						if (next.first >= 0 && next.first <= m - 1 && next.second >= 0 && next.second <= n - 1 && draw[next.second][next.first] == 1) {
							draw[next.second][next.first] = -1;
							q.push(next);
							area++;
						}
					}
				}
				if (max_area < area)
					max_area = area;
			}
		}
	return max_area;
}

int main(void) {
	cin >> n >> m;

	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++) {
			int num;
			cin >> num;
			draw[i].push_back(num);
		}

	int max_area = breadth_first_search();
	cout << number << '\n';
	cout << max_area;
	return 0;
}  
  </teatarea>
<p> </p>
<p>배운점</p>

 

Comments