제출 #1235891

#제출 시각아이디문제언어결과실행 시간메모리
1235891toast12Zoo (COCI19_zoo)C++20
0 / 110
0 ms320 KiB
#include <bits/stdc++.h> using namespace std; int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1}; int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1}; int main() { int r, c; cin >> r >> c; vector<vector<char>> grid(r+2, vector<char>(c+2, '*')); for (int i = 1; i <= r; i++) { for (int j = 1; j <= c; j++) cin >> grid[i][j]; } vector<vector<int>> comp(r+2, vector<int>(c+2)); vector<vector<bool>> visited(r+2, vector<bool>(c+2)); int cur = 1; for (int i = 1; i <= r; i++) { for (int j = 1; j <= c; j++) { if (visited[i][j] || grid[i][j] == '*') continue; visited[i][j] = true; comp[i][j] = cur; queue<pair<int, int>> q; q.push({i, j}); while (!q.empty()) { int x = q.front().first, y = q.front().second; q.pop(); comp[x][y] = cur; for (int k = 0; k < 8; k++) { if (!visited[x+dx[k]][y+dy[k]] && grid[x+dx[k]][y+dy[k]] == grid[x][y]) { q.push({x+dx[k], y+dy[k]}); visited[x+dx[k]][y+dy[k]] = true; } } } cur++; } } vector<set<int>> adj((r*c)+r+c); for (int i = 1; i <= r; i++) { for (int j = 1; j <= c; j++) { for (int k = 0; k < 8; k++) { if (comp[i+dx[k]][j+dy[k]] != -1 && comp[i+dx[k]][j+dy[k]] != comp[i][j]) adj[comp[i][j]].insert(comp[i+dx[k]][j+dy[k]]); } } } int ans = 0; queue<int> q; q.push(comp[1][1]); vector<bool> v(cur); v[comp[1][1]] = true; while (!q.empty()) { int cur = q.front(); q.pop(); ans++; for (auto e : adj[cur]) { if (!v[e]) { q.push(e); v[e] = true; } } } cout << ans-1 << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...