ABC275c
记住当一个点为i,j且偏移量为dx,dy的时候 正方形的情况下四个点坐标如下
int i2 = i + dx, j2 = j + dy;
int i3 = i2 - dy, j3 = j2 + dx;
int i4 = i3 - dx, j4 = j3 - dy;
根据题解复现一遍,以后复习
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
int main() {
// 定义一个包含 9 个字符串的向量 s,用于存储 9x9 的字符网格
vector<string> s(9);
// 循环读取 9 行输入,每行存储在 s 的一个元素中
for (auto &c : s) cin >> c;
// 定义一个 lambda 函数 valid,用于检查给定坐标 (x, y) 是否在网格内且该位置字符为 '#'
auto valid = [&](int x, int y) {
return x >= 0 && x < 9 && y >= 0 && y < 9 && s[x][y] == '#';
};
// 定义一个 set 用于存储不同的正方形,每个正方形由四个顶点的坐标组成
set<set<pair<int, int>>> st;
// 枚举网格中的每一个点 (i, j) 作为正方形的一个顶点
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
// 枚举所有可能的向量 (dx, dy)
for (int dx = -8; dx <= 8; dx++) {
for (int dy = -8; dy <= 8; dy++) {
// 排除向量为 (0, 0) 的情况
if (dx == 0 && dy == 0) continue;
// 计算正方形的另外三个顶点的坐标
int i2 = i + dx, j2 = j + dy;
int i3 = i2 - dy, j3 = j2 + dx;
int i4 = i3 - dx, j4 = j3 - dy;
// 检查这四个顶点是否都在网格内且为 '#' 字符
if (valid(i, j) && valid(i2, j2) && valid(i3, j3) && valid(i4, j4)) {
// 定义一个 set 用于存储当前正方形的四个顶点
set<pair<int, int>> sq;
sq.insert({i, j});
sq.insert({i2, j2});
sq.insert({i3, j3});
sq.insert({i4, j4});
// 将当前正方形插入到 st 中,确保不重复计数
st.insert(sq);
}
}
}
}
}
// 输出不同正方形的数量
cout << st.size() << endl;
return 0;
}

浙公网安备 33010602011771号