Submission #1003428

#TimeUsernameProblemLanguageResultExecution timeMemory
1003428thelepiDijamant (COCI22_dijamant)C++17
70 / 70
180 ms8028 KiB
#include <iostream> #include <algorithm> #include <cassert> #include <vector> using namespace std; bool inBounds(int x, int y, int n, int m){ return x >= 0 && x < m && y >= 0 && y < n; } //End inclusive bool isDiamond(vector<vector<char>> &table, int n, int m, int ax, int ay, int bx, int by){ int sidelength = bx - ax + 1; //last row of # if(!inBounds(ax + sidelength - 1, ay + sidelength - 1, n, m) || !inBounds(bx + sidelength - 1, by + sidelength - 1, n, m)) return false; for (int i = 0; i < sidelength; i++) { if(table[ay + sidelength - 1 - i][ax + sidelength - 1 + i] != '#') return false; } for (int i = 1; i < sidelength - 1; i++) { //Side of # if(!inBounds(ax + i, ay + i, n, m) || !inBounds(bx + i, by + i, n, m) || table[ay + i][ax + i] != '#' || table[by + i][bx + i] != '#') return false; //. between # for (int j = 1; j < sidelength - 1; j++) { if(table[ay + i - j][ax + i + j] != '.') return false; } } //rows without # for (int i = 0; i < sidelength - 1; i++) { for (int j = 0; j < sidelength - 1; j++) { if(table[ay + i - j][ax + i + j + 1] != '.') return false; } } return true; } //End inclusive int countDiamonds(vector<vector<char>> &table, int n, int m, int ax, int ay, int bx, int by){ int count = 0; while(bx - ax > 0){ if(inBounds(ax + 1, ay + 1, n, m) && table[ay + 1][ax + 1] == '#'){ int startx = ax; int starty = ay; do{ ax++; ay--; } while(bx >= ax && inBounds(ax + 1, ay + 1, n, m) && table[ay + 1][ax + 1] == '.'); if(bx < ax || !inBounds(ax + 1, ay + 1, n, m)){ return count; } assert((table[ay + 1][ax + 1] == '#')); if(isDiamond(table, n, m, startx, starty, ax, ay)) count++; } else{ ax++; ay--; } } return count; } int main(int, char**){ int n, m; cin >> n >> m; vector<vector<char>> table; table.resize(n); for (int i = 0; i < n; i++) { table[i].resize(m); for (int j = 0; j < m; j++) { cin >> table[i][j]; } } int count = 0; for (int i = 1; i < n + m - 2; i++) { int start; bool inrange = false; int x; int y; for(int j = max(i + 1 - n, 0); j < min(i + 1, m); j++){ x = j; y = i - j; if(table[y][x] == '.' && inrange){ count += countDiamonds(table, n, m, start, i - start, x - 1, y + 1); inrange = false; } else if(table[y][x] == '#' && !inrange){ start = j; inrange = true; } } if(inrange){ count += countDiamonds(table, n, m, start, i - start, x, y); } } cout << count << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...