白駿2667:番号のみ


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

★★★☆☆

1.近接



  • 軒は隣接する家を検査しなければならないので、BFSは適当な
  • です.
  • bfs内部では、上下左右の家屋との接続性を確認するには、
  • dequeペア入力家屋の座標値
  • 配列を超えるインデックス値は,上下左右を比較できるため,MAX値を2増加させた結果が得られた.
  • 一度に
  • の入力値を貼り付けるので、入力を分離するためにchar配列
  • を用いる.
  • 結リンゴ値は昇順に与えるべきであるためsortアルゴリズム
  • を用いた.

    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;
    
    }