这个页面用于吐槽多校第四场的一道题目。
作为面向对象(Java)大作业感觉不错,建议未来的助教们可以考虑考虑。
ZYB对数学有敏锐的直觉,尤其是在几何问题上。
几何问题是这样的:求∠CAM的值。
或者是这样的:如果AC=x−3,BE=20,AB=16,CD=x+5,求x。
为了更容易地分析问题,输入将包含逻辑形式,而不是原始的问题文本和图表。
给出若干个符合一定规则的几何题条件。
要求出某个角或者某条边或未知数x的值。
请注意,图和文本中的所有条件都将转换为逻辑形式。你现在得到了一个只有一个问题(Find phrase)的逻辑表单列表,并希望找到解决方案。
输入包含多个样例。输入的第一行包含一个整数T(总是5),即样例数。
对于每个样例,第一行包含一个整数N(3≤N≤12),表示逻辑形式的数量。第二行包含几个以空格分隔的大写字母,表示与此问题相关的所有点。第三行包含几个长度为2的大写字母字符串,表示与此问题相关的所有直线(线段)。在接下来的N行中,有一个字符串si(|si|≤50),表示第i个逻辑形式。
保证最后一个逻辑形式以“Find”开头。
对于每种情况,输出一个表示答案的整数。不应该牵涉到未知的数字。
5 11 N M B C T A D MA MB MT MD AB AC BC TC TN CN Equals(MeasureOf(Angle(M, T, N)), 28) PointLiesOnLine(B, Line(A, C)) PointLiesOnLine(D, Line(T, N)) PointLiesOnCircle(N, Circle(M)) PointLiesOnCircle(C, Circle(M)) PointLiesOnCircle(T, Circle(M)) PointLiesOnCircle(A, Circle(M)) Perpendicular(Line(A, B), Line(M, B)) Perpendicular(Line(D, M), Line(T, D)) Equals(LengthOf(Line(B, M)), LengthOf(Line(D, M))) Find(MeasureOf(Angle(C, A, M))) 8 A B C D E AC AD AB AE BC BE CD DE Equals(LengthOf(Line(A, C)), x-3) Equals(LengthOf(Line(A, B)), 16) Equals(LengthOf(Line(C, D)), x+5) Equals(LengthOf(Line(B, E)), 20) PointLiesOnLine(C, Line(A, D)) PointLiesOnLine(B, Line(A, E)) Parallel(Line(B, C), Line(E, D)) Find(x) 12 A B C D F CB CD CA CF BD BA BF DA DF AF Equals(MeasureOf(Angle(F, A, D)), 20) Equals(LengthOf(Line(D, A)), 9) Equals(MeasureOf(Angle(F, A, B)), 32) Equals(LengthOf(Line(B, A)), 6) Equals(MeasureOf(Angle(A, D, B)), 40) PointLiesOnLine(F, Line(C, A)) PointLiesOnLine(F, Line(B, D)) Parallel(Line(A, D), Line(B, C)) Equals(LengthOf(Line(A, D)), LengthOf(Line(B, C))) Parallel(Line(A, B), Line(D, C)) Equals(LengthOf(Line(A, B)), LengthOf(Line(D, C))) Find(MeasureOf(Angle(D, B, A))) 5 A B C AB BC AC Equals(LengthOf(Line(A, B)), 2x-7) Equals(LengthOf(Line(B, C)), 4x-21) Equals(LengthOf(Line(A, C)), x-3) Equals(LengthOf(Line(A, B)), LengthOf(Line(B, C))) Find(LengthOf(Line(A, C))) 5 A B C AB AC BC Equals(LengthOf(Line(A, C)), 3) Equals(LengthOf(Line(A, B)), 5) Equals(LengthOf(Line(B, C)), x) Perpendicular(Line(A, C), Line(B, C)) Find(x) 28 35 88 4 4
5 7 A C B D E AB AC AE AD BE BC DE CD Equals(LengthOf(Line(A, C)), 16) Equals(LengthOf(Line(E, D)), 5) Equals(LengthOf(Line(A, B)), 12) PointLiesOnLine(B, Line(A, C)) Parallel(Line(C, D), Line(B, E)) PointLiesOnLine(E, Line(A, D)) Find(LengthOf(Line(A, E))) 12 A B C D F CB CD CA CF BD BA BF DA DF AF Equals(MeasureOf(Angle(F, A, D)), 20) Equals(LengthOf(Line(D, A)), 9) Equals(MeasureOf(Angle(F, A, B)), 32) Equals(LengthOf(Line(B, A)), 6) Equals(MeasureOf(Angle(D, B, C)), 40) PointLiesOnLine(F, Line(C, A)) PointLiesOnLine(F, Line(B, D)) Parallel(Line(A, D), Line(B, C)) Equals(LengthOf(Line(A, D)), LengthOf(Line(B, C))) Parallel(Line(A, B), Line(D, C)) Equals(LengthOf(Line(A, B)), LengthOf(Line(D, C))) Find(MeasureOf(Angle(A, D, C))) 12 A B C D E F G GC GD GB GF GA GE CE BF BA FA Equals(MeasureOf(Angle(A, G, C)), 60) PointLiesOnLine(F, Line(G, A)) PointLiesOnLine(G, Line(C, E)) PointLiesOnLine(G, Line(B, F)) PointLiesOnLine(G, Line(B, A)) PointLiesOnLine(F, Line(B, A)) PointLiesOnCircle(C, Circle(G)) PointLiesOnCircle(B, Circle(G)) PointLiesOnCircle(A, Circle(G)) PointLiesOnCircle(E, Circle(G)) Perpendicular(Line(G, F), Line(G, D)) Find(MeasureOf(Angle(B, G, E))) 3 A B C AB AC BC Equals(MeasureOf(Angle(A, B, C)), 40) Equals(MeasureOf(Angle(C, A, B)), 25) Find(MeasureOf(Angle(B, C, A))) 6 D A B K G KG GD DA KA AB KB Equals(MeasureOf(Angle(B, A, D)), 3x-70) Equals(MeasureOf(Angle(K, G, D)), 120) Equals(MeasureOf(Angle(G, D, A)), x) Parallel(Line(K, G), Line(A, D)) PointLiesOnLine(A, Line(K, B)) Find(x) 15 128 60 115 60
题目保证了每一步的结果依然是 expressions。
我们不断用已知的条件和定理扩展我们知道的量,直到找到答案。中途可能需要构方程和解方程。
整个过程有点像迭代加深搜索。
同一个角的表示有很多种,注意要对它们建立Equal关系。
对于所有 PointLiesOnLine,要构建边长相加的 Equal 关系和角度相加的 Equal 关系。
对于平行线,同位角可能不存在,所以可以只用内错角和同旁内角建立关系。
可以先不断地用“基本定理”传播 expression,到最后再用勾股定理、相似定理等复杂的定理解方程。
要能检测出图中的三角形(只要三点不共线就算),并积极寻找全等和相似的三角形对。
在运用一些定理时,所用的条件可能不是“完全”的。比如我们知道两条边的长度都是 2x+3,我们依然可以利用它们相等来构建 对角相等 或者 三角形全等 的关系。
可以用 Find 导向去优化搜索方向。不过这道题是不必要的,你把所有可以求的量求出来也是 OK 的。
在解出 x 后,要把之前所有用 x 表示的表达式都带入一遍。
复杂度为 所有状态量 * 定理数量 * 步数上限(4)。