白駿2667:番号のみ
https://www.acmicpc.net/problem/2667
★★★☆☆
各軒は隣接する家を検査しなければならないので、BFSは適当な です. bfs内部では、上下左右の家屋との接続性を確認するには、 dequeペア入力家屋の座標値 配列を超えるインデックス値は,上下左右を比較できるため,MAX値を2増加させた結果が得られた.
一度にの入力値を貼り付けるので、入力を分離するためにchar配列 を用いる.結リンゴ値は昇順に与えるべきであるためsortアルゴリズム を用いた.
★★★☆☆
1.近接
各
2.私の回答
#include <iostream>
#include <deque>
#include <vector>
#include <algorithm>
#define MAX 27 // 원래는 25이지만 상하좌우 값 비교를 위해 2씩 늘려줌
using namespace std;
int n,tem;
bool visited[MAX][MAX];
bool graph[MAX][MAX];
deque<pair<int, int>> q;
void bfs(int i,int j) { //너비 우선 탐색
q.push_back(make_pair(i, j)); //deque에 pair 값 만들어서 넣어주기
visited[i][j] = true;
while (!q.empty()) {
i = q.front().first; //pair값에서 꺼내기
j = q.front().second;
//cout << "(" << i << ", " << j << ") 방문\n";
q.pop_front();
if (graph[i + 1][j] && !visited[i + 1][j]) { //우
visited[i + 1][j] = true;
q.push_back(make_pair(i + 1, j));
}
if (graph[i - 1][j] && !visited[i - 1][j]) { //좌
visited[i - 1][j] = true;
q.push_back(make_pair(i - 1, j));
}
if (graph[i][j + 1] && !visited[i][j + 1]) { //하
visited[i][j + 1] = true;
q.push_back(make_pair(i, j + 1));
}
if(graph[i][j -1] &&!visited[i][j - 1]) { //상
visited[i][j -1] = true;
q.push_back(make_pair(i, j -1));
}
tem++; //단지 가구 수 카운트
}
return;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
char input[MAX]; //입력을 위한 char 배열
cin >> input;
for (int j = 1; j <= n; j++) {
if(input[j-1]=='0') graph[i][j]=0;
else graph[i][j] = 1;
}
}
vector<int> ret;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (graph[i][j]&& !visited[i][j]) {
bfs(i, j);
ret.push_back(tem); //가구 수 더해주기
tem = 0;
//cout << ret.size() << " 끝 =================== \n\n";
}
}
}
sort(ret.begin(), ret.end()); //오름차순 정렬
cout << ret.size() << "\n"; // 배열의 크기가 단지의 수
for (int i = 0; i < ret.size(); i++) {
cout << ret[i] << "\n";
}
return 0;
}
Reference
この問題について(白駿2667:番号のみ), 我々は、より多くの情報をここで見つけました https://velog.io/@jeongopo/백준-2667-단지번호붙이기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol