2023-05-08 22:09:27 +02:00
|
|
|
#include <cassert>
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
class Solution {
|
2024-01-03 12:06:42 +01:00
|
|
|
struct indices {
|
|
|
|
int x;
|
|
|
|
int y;
|
|
|
|
|
|
|
|
bool operator==(const indices &other) const = default;
|
|
|
|
indices &operator+=(const indices &other) {
|
|
|
|
x += other.x;
|
|
|
|
y += other.y;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
int operator[](const std::vector<std::vector<int>> &mat) const {
|
|
|
|
return mat[y][x];
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
public:
|
|
|
|
int diagonalSum(const std::vector<std::vector<int>> &mat) {
|
|
|
|
int sum = 0;
|
|
|
|
|
|
|
|
indices down{0, 0}, up{0, static_cast<int>(mat.size()) - 1};
|
|
|
|
indices d_down{1, 1}, d_up{1, -1};
|
|
|
|
for (std::size_t i = 0; i < mat.size();
|
|
|
|
++i, down += d_down, up += d_up) {
|
|
|
|
sum += down[mat];
|
|
|
|
if (down != up) {
|
|
|
|
sum += up[mat];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return sum;
|
2023-05-08 22:09:27 +02:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
int main() {
|
2024-01-03 12:06:42 +01:00
|
|
|
Solution s;
|
|
|
|
|
|
|
|
assert((s.diagonalSum({{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}) == 25));
|
|
|
|
assert(
|
|
|
|
(s.diagonalSum(
|
|
|
|
{{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}}) == 8));
|
|
|
|
assert((s.diagonalSum({{5}}) == 5));
|
|
|
|
return 0;
|
2023-05-08 22:09:27 +02:00
|
|
|
}
|