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

 

1926번: 그림

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

www.acmicpc.net

쉽다~

#include <iostream>
#include <vector>
#include <queue>
#include<string>
#include<algorithm>
#include<cmath>
#include<unordered_map>
#include<map>
#include<stack>
using namespace std;

struct Point {
	int i, j, t, cnt, power;
	char c;
};

void Prints(vector<vector<int>>maps, int n, int m) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cout << maps[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
}

void Prints(vector<vector<bool>>maps, int n, int m) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cout << maps[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
}
void Prints(vector<vector<char>>maps, int n, int m) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cout << maps[i][j];
		}
		cout << endl;
	}
	cout << endl;
}
void Prints(vector<vector<vector<char>>>maps, int n, int m, int k) {
	for (int t = 0; t < k; t++) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				cout << maps[t][i][j];
			}
			cout << endl;
		}
		cout << endl;
	}
	cout << endl;
}

void Prints(vector<vector<vector<bool>>>maps, int n, int m, int k) {
	for (int t = 0; t < k; t++) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				cout << maps[t][i][j];
			}
			cout << endl;
		}
		cout << endl;
	}
	cout << endl;
}
void Prints(vector<int>line, int n) {
	for (int i = 0; i < n; i++) {
		cout << line[i] << ",";
	}
	cout << endl;
}
void Prints(string str, int n) {
	for (int i = 0; i < n; i++) {
		cout << str[i] << ",";
	}
	cout << endl;
}

bool cmp(const pair<int, int>& a, const pair<int, int>& b) {

	return a.second < b.second;
}

struct Data {
	int score;
	int player;
};

int main() {
	int n, m;
	cin >> n >> m;
	vector<vector<int>>maps;
	vector<bool > tmpbVisited(m, false);
	vector<vector<bool>>bVisited(n, tmpbVisited);
	for (int i = 0; i < n; i++) {
		vector<int>tmpMaps;
		for (int j = 0; j < m; j++) {
			int tmp;
			cin >> tmp;
			if (tmp == 1) {
				bVisited[i][j] = true;
			}
			tmpMaps.push_back(tmp);
		}
		maps.push_back(tmpMaps);
	}
//	cout << endl;
//	Prints(maps, n, m);
	queue<Point>q;
	vector<int>nodeCount;
	int diri[] = {1,-1,0,0};
	int dirj[] = { 0,0,1,-1 };
	int squareCnt = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			int cnt = 0;
			if (bVisited[i][j] == true) {
				Point p;
				p.i = i;
				p.j = j;
				p.cnt = 1;
				cnt++;
				bVisited[i][j] = false;
				q.push(p);
				squareCnt++;
				while (!q.empty()) {
					Point start = q.front();
					q.pop();
					
					for (int t = 0; t < 4; t++) {
						int tmpDiri = start.i + diri[t];
						int tmpDirj = start.j + dirj[t];
						if (tmpDiri == -1 || tmpDirj == -1 || tmpDiri >= n || tmpDirj >= m) {
							continue;
						}
						if (bVisited[tmpDiri][tmpDirj] == false) {
							continue;
						}
						bVisited[tmpDiri][tmpDirj] = false;
						Point tmpP;
						tmpP.i = tmpDiri;
						tmpP.j = tmpDirj;
						tmpP.cnt = start.cnt + 1;
						q.push(tmpP);
						cnt++;
					//	Prints(bVisited, n, m);
					}
				}
				nodeCount.push_back(cnt);
		   }
		}
	}
	cout << squareCnt << endl;
	
	if (nodeCount.size() > 0) {
		sort(nodeCount.begin(), nodeCount.end(), greater<>());
		cout << nodeCount[0];
	}
	else {
		cout << 0;
	}
	
	return 0;
}

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

백준 NBA 농구  (0) 2023.08.03
백준 효율적인 해킹  (0) 2023.08.02
백준 스위치 켜고 끄기  (0) 2023.08.01
백준 등수 구하기  (0) 2023.08.01
백준 덩치  (1) 2023.07.31

+ Recent posts