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 |