[C++]白準2667:番号のみ
#include <iostream>
#include <vector>
#include <algorithm> // sort
using namespace std;
int N;
int map[26][26] = {0}; // 간선 저장
bool visited[26][26] = {false}; // 방문 여부 저장
int dy[4] = {1, -1, 0, 0};
int dx[4] = {0, 0, 1, -1};
int cnt = 0; // 단지 개수
vector<int> v;
void DFS(int x, int y){
cnt++;
visited[x][y] = true; // 방문 처리
for(int i = 0; i < 4; i++){ // 모든 방향 순회
int nx = x + dx[i];
int ny = y + dy[i];
if(nx < 0 || ny < 0 || nx >= N || ny >= N){ // 범위 벗어난 경우
continue;
}else if(map[nx][ny] == 1 && visited[nx][ny] == false){ // else if 말고 if
DFS(nx, ny);
}
}
}
int main(int argc, char** argv){
scanf("%d", &N);
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
scanf("%1d", &map[i][j]); // 숫자 1개씩 입력받기
}
}
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
if(map[i][j] == 1 && visited[i][j] == false){ // 집이 있고 방문된 적 없다면
cnt = 0;
DFS(i, j);
v.push_back(cnt);
}
}
}
sort(v.begin(), v.end()); // 오름차순 정렬
printf("%lu\n", v.size());
for(int i = 0; i < v.size(); i++){
printf("%d\n", v[i]);
}
return 0;
}
典型的なDFS練習問題.最初はBFSが簡単だと思っていましたが、今はDFSだけが簡単だと思っています・・・本当に学力がない.DFSのみを使用して問題を解決します.
実は以前のコードは和解を見なければならないことがたくさんあります.解き続けるしかないでしょう.
がんばってください.やればいい!
Reference
この問題について([C++]白準2667:番号のみ), 我々は、より多くの情報をここで見つけました https://velog.io/@lamknh/C-백준-2667-단지번호붙이기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol