From f22a59ac9d9065cbf02a5134010c3cecc171a270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Sat, 20 Jan 2024 17:18:15 +0800 Subject: [PATCH] 'commit' --- TangDou/LuoGuBook/ZhiMuSanJiaoXing.cpp | 42 ++++++++++++++++++++++---- TangDou/LuoGuBook/ZhiMuSanJiaoXing.in | 4 +-- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/TangDou/LuoGuBook/ZhiMuSanJiaoXing.cpp b/TangDou/LuoGuBook/ZhiMuSanJiaoXing.cpp index 9b8580a..b79ff1b 100644 --- a/TangDou/LuoGuBook/ZhiMuSanJiaoXing.cpp +++ b/TangDou/LuoGuBook/ZhiMuSanJiaoXing.cpp @@ -4,6 +4,9 @@ char a[N][N]; /* 4 abccddadca + +2 +aaa */ using namespace std; @@ -12,6 +15,27 @@ struct Node { char c; }; vector q; +/* +把半径当做 1 ,建立坐标系,然后枚举就行了,需要注意的是,在判断三条边的长度是否相等时用 double 牵扯到精度问题, +解决方法是:比较长度的平方,长度的平方肯定是整数,还有就是层层之间纵坐标相差是sqrt(3) 的倍数, +为了不牵扯到小数,把纵坐标的 sqrt(3) 当做1 ,求边长时乘三即可。 +*/ +int pf(int x) { + return x * x; +} + +bool check(Node a, Node b, Node c) { + cout << "a.x=" << a.x << ",a.y=" << a.y << endl; + cout << "b.x=" << b.x << ",b.y=" << a.y << endl; + cout << "c.x=" << c.x << ",c.y=" << a.y << endl; + + // a与b之间距离 不等于 a与c之间距离 + if (pf(a.x - b.x) + pf(a.y - b.y) * 3 != pf(a.x - c.x) + pf(a.y - c.y) * 3) return false; + // a与b之间距离 不等于 b与c之间距离 + if (pf(a.x - b.x) + pf(a.y - b.y) * 3 != pf(b.x - c.x) + pf(b.y - c.y) * 3) return false; + + return true; +} int main() { #ifndef ONLINE_JUDGE @@ -29,16 +53,22 @@ int main() { // 把所有坐标记录下来 for (int i = 0; i < n; i++) { - for (int j = 0; j <= i; j++) - q.push_back({i, j, a[i][j]}); + for (int j = 0; j <= i; j++) { + q.push_back({n - 1 - i, j, a[i][j]}); + // cout << "x=" << n - 1 - i << ",y=" << j << " " << a[i][j] << endl; + } } + vector res; // 在q数组中,选择任意三个,计算两两间距离是不是相等 for (int i = 0; i < q.size(); i++) - for (int j = i + 1; j < q.size(); j++) - for (int k = j + 1; k < q.size(); k++) { - Node x = q[i], y = q[j], z = q[k]; - if (check()) res.push_back(x.c); + for (int j = 0; j < q.size(); j++) + for (int k = 0; k < q.size(); k++) { + if (i == j || i == k || j == k) continue; + + if (q[i].c != q[j].c || q[i].c != q[k].c || q[j].c != q[k].c) continue; + if (check(q[i], q[j], q[k])) + res.push_back(q[i].c); } if (res.size() == 0) diff --git a/TangDou/LuoGuBook/ZhiMuSanJiaoXing.in b/TangDou/LuoGuBook/ZhiMuSanJiaoXing.in index 7f7dc01..0ae8f7f 100644 --- a/TangDou/LuoGuBook/ZhiMuSanJiaoXing.in +++ b/TangDou/LuoGuBook/ZhiMuSanJiaoXing.in @@ -1,2 +1,2 @@ -4 -abccddadca \ No newline at end of file +2 +aaa \ No newline at end of file