제출 #1220888

#제출 시각아이디문제언어결과실행 시간메모리
1220888toast12Tetris (COCI17_tetris)C++20
40 / 80
0 ms328 KiB
#include <bits/stdc++.h> using namespace std; int check1(vector<pair<int, int>> &pos) { set<int> x, y; for (int i = 0; i < 4; i++) { x.insert(pos[i].first); y.insert(pos[i].second); } if (x.size() == 2 && y.size() == 2) return 1; return 0; } int check2(vector<pair<int, int>> &pos) { set<int> x, y; for (int i = 0; i < 4; i++) { x.insert(pos[i].first); y.insert(pos[i].second); } if ((x.size() == 1 && y.size() == 4) || (x.size() == 4 && y.size() == 1)) return 1; return 0; } int check3(vector<pair<int, int>> &pos) { /* XX or X XX XX X */ if (pos[0].first == pos[1].first-1 && pos[0].second == pos[1].second && pos[0].first == pos[2].first && pos[0].second == pos[2].second-1 && pos[1].first == pos[3].first && pos[1].second == pos[3].second+1) return 1; if (pos[0].first == pos[1].first-1 && pos[0].second == pos[1].second && pos[1].first == pos[2].first && pos[1].second == pos[2].second-1 && pos[2].first == pos[3].first-1 && pos[1].second == pos[2].second) return 1; return 0; } int check4(vector<pair<int, int>> &pos) { /* XX or X XX XX X */ if (pos[0].first == pos[1].first && pos[0].second == pos[1].second-1 && pos[1].first == pos[2].first-1 && pos[1].second == pos[2].second && pos[2].first == pos[3].first && pos[2].second == pos[3].second-1) return 1; if (pos[0].first == pos[1].first-1 && pos[0].second == pos[1].second && pos[1].first == pos[2].first && pos[1].second == pos[2].second+1 && pos[2].first == pos[3].first-1 && pos[2].second == pos[3].second) return 1; return 0; } int main() { int n, m; cin >> n >> m; vector<vector<char>> grid(n+2, vector<char>(m+2)); fill(grid[0].begin(), grid[0].end(), '.'); fill(grid[n+1].begin(), grid[n+1].end(), '.'); for (int i = 1; i <= n; i++) { grid[i][0] = '.'; grid[i][m+1] = '.'; for (int j = 1; j <= m; j++) cin >> grid[i][j]; } vector<int> ans(6); vector<vector<bool>> visited(n+2, vector<bool>(m+2)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (visited[i][j]) continue; if (grid[i][j] == '.') continue; queue<pair<int, int>> q; q.push({i, j}); vector<pair<int, int>> pos; while (!q.empty()) { int r = q.front().first, c = q.front().second; q.pop(); pos.push_back({r, c}); visited[r][c] = true; if (!visited[r+1][c] && grid[r+1][c] == grid[i][j]) { q.push({r+1, c}); visited[r+1][c] = true; } if (!visited[r-1][c] && grid[r-1][c] == grid[i][j]) { q.push({r-1, c}); visited[r-1][c] = true; } if (!visited[r][c+1] && grid[r][c+1] == grid[i][j]) { q.push({r, c+1}); visited[r][c+1] = true; } if (!visited[r][c-1] && grid[r][c-1] == grid[i][j]) { q.push({r, c-1}); visited[r][c-1] = true; } } if (check1(pos)) ans[1]++; else if (check2(pos)) ans[2]++; else if (check3(pos)) ans[3]++; else if (check4(pos)) ans[4]++; else ans[5]++; } } cout << ans[1] << '\n' << ans[2] << '\n' << ans[3] << '\n' << ans[4] << '\n' << ans[5] << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...