관리 메뉴

Mini

백준 1926 c++ // bfs, 갯수카운팅 본문

Algorithm/bfs

백준 1926 c++ // bfs, 갯수카운팅

Mini_96 2023. 9. 4. 13:29

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

 

1926번: 그림

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

www.acmicpc.net

* 의사코드

큐에 넣을때마다(이동가능 일때)

cnt 변수 1씩증가 => 1의 갯수카운팅

 

* 전체코드

#include <bits/stdc++.h>
using namespace std;

int n, m, y, x, ny, nx, ret1,ret2;
int a[504][504], v[504][504];
int dy[] = {1,0,-1,0};
int dx[] = {0,1,0,-1};


void bfs(int y, int x) {

	//cout << "bfs ; " << y << " " << x << "\n";

	int cnt = 1;
	queue<pair<int, int>> q;
	v[y][x] = 1;
	q.push({ y,x });

	while (q.size()) {
		tie(y, x) = q.front(); q.pop();
		for (int i = 0; i < 4; ++i) {
			ny = y + dy[i];
			nx = x + dx[i];
			if (ny < 0 || ny >= n || nx < 0 || nx >= m) continue;
			if (v[ny][nx]) continue;
			if (a[ny][nx] == 0) continue;

			q.push({ ny,nx });
			v[ny][nx] = v[y][x] + 1;
			cnt++;
			//ret2 = max(ret2, v[ny][nx]);
		}
	}

	ret2 = max(ret2, cnt);
	/*for (int i = 0; i < n; ++i) {
		for (int j = 0; j < m; ++j) {
			cout << v[i][j] << " ";
		}
		cout << "\n";
	}*/
}

int main(void) {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	cin >> n >> m;

	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < m; ++j) {
			cin >> a[i][j];
		}
	}

	/*for (int i = 0; i < n; ++i) {
		for (int j = 0; j < m; ++j) {
			cout << a[i][j] << " ";
		}
		cout << "\n";
	}*/
	//queue<pair<int,int>> q;


	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < m; ++j) {
			if (v[i][j]) continue;
			if (a[i][j] == 0) continue;
			ret1++;
			bfs(i, j);
		}
	}

	cout << ret1 << "\n" << ret2;


}