2025蓝桥杯省赛A组地雷阵题解:几何转化与区间合并算法详解
一、题目解读
2025年蓝桥杯省赛A组地雷阵题目(洛谷12144)要求计算在平面直角坐标系第一象限中,给定n个地雷的位置坐标和触发半径,从原点出发随机选择一个方向行走,不触发地雷的通关概率。题目将游戏问题转化为几何计算:需统计危险角度区间,并通过概率公式求解。
二、解题思路
核心思想是几何转化+区间合并:
1. 危险角度计算:每个地雷对应一个危险角度区间,通过计算地雷圆心到原点连线与x轴的夹角α及切线夹角θ,得到区间[α-θ, α+θ]。
2. 区间合并:合并重叠区间,减少危险角度总量,避免重复计算。
3. 概率计算:用总危险角度占[0, π/2]的比例,反推安全概率。
特殊处理:若原点在地雷范围内,直接输出0,避免后续计算。
三、解题步骤
1. 输入与预处理:读取n个地雷的(x,y,r),判断原点是否在地雷内。
2. 计算单个危险区间:
计算地雷到原点距离d与夹角α。
若d≤r,原点触发,结束;否则计算切线夹角θ,形成区间[L, R]。
3. 合并区间:
按左端点排序,遍历合并重叠区间(如新区间与当前区间右端重叠,扩展右端)。
4. 计算总危险角度:累加合并后区间的长度。
5. 输出概率:1 - (危险角度 / π/2),保留三位小数。
四、代码及注释
#include <iostream> #include <vector> #include <algorithm> #include <cmath> #include <iomanip> using namespace std; const double PI = acos(-1.0); // 表示一个角度区间 struct Interval { double l, r; Interval(double _l = 0, double _r = 0) : l(_l), r(_r) {} bool operator<(const Interval& other) const { return l < other.l; } }; int main() { int n; cin >> n; vector<Interval> intervals; for (int i = 0; i < n; ++i) { double x, y, r; cin >> x >> y >> r; // 计算地雷中心到原点的距离 double d = sqrt(x * x + y * y); if (d <= r) { // 如果原点在地雷范围内,所有方向都会触发地雷 cout << "0.000" << endl; return 0; } // 计算切线与x轴的夹角 double theta = asin(r / d); // 计算地雷中心与x轴的夹角 double alpha = atan2(y, x); // 计算危险角度区间 double L = alpha - theta; double R = alpha + theta; // 确保角度在[0, PI/2]范围内 if (R < 0) continue; // 完全在左边,不影响 if (L > PI/2) continue; // 完全在右边,不影响 L = max(L, 0.0); R = min(R, PI/2); if (L < R) { intervals.emplace_back(L, R); } } // 合并重叠的区间 if (!intervals.empty()) { sort(intervals.begin(), intervals.end()); vector<Interval> merged; merged.push_back(intervals[0]); for (int i = 1; i < intervals.size(); ++i) { if (intervals[i].l <= merged.back().r) { merged.back().r = max(merged.back().r, intervals[i].r); } else { merged.push_back(intervals[i]); } } intervals = merged; } // 计算总危险角度范围 double danger = 0; for (const auto& interval : intervals) { danger += interval.r - interval.l; } // 输出安全概率 cout << fixed << setprecision(3) << 1 - (danger / (PI / 2)); }
注释说明:
● Interval结构定义角度区间,用于存储危险范围。
● atan2(y, x)计算带象限的反正切,确保角度正确。
● 区间合并逻辑通过贪心策略,维护左端点递增的区间列表。
五、总结
该解法巧妙将地雷触发问题转化为角度区间计算,通过几何转化降低复杂度。区间合并算法是核心,需注意边界处理(原点触发、角度范围限制)。代码简洁高效,适用于大规模数据。未来可优化合并过程的时间复杂度,或采用更精确的几何算法提升性能。
原创内容 转载请注明出处