洛谷P13752 【MX-X17-T1】Walk,Walk,Walk题解
1.题目大意
从起点到终点的路径会穿过哪些直线,并统计这些直线的数量。
2.思路
对于 \(x=k\) 的直线,如果 \(k\) 等于起点或终点的 \(x\) 坐标,或者 \(k\) 在起点和终点的 \(x\) 坐标之间,则会被穿过;对于 \(y=k\) 的直线,如果 \(k\) 等于起点或终点的 \(y\) 坐标,或者 \(k\) 在起点和终点的 \(y\) 坐标之间,则会被穿过。
即当 \(t=1\) 时,判断 \(x=k\) 的直线是否满足条件,否则判断 \(y=k\) 的直线是否满足。若满足条件,则用变量 cscc 记录。
//核心判断
if (t == 1) {
if (k == sx || k == tx || (sx < k && k < tx) || (tx < k && k < sx)) {
cscc++;
}
} else {
if (k == sy || k == ty || (sy < k && k < ty) || (ty < k && k < sy)) {
cscc++;
}
}
而因为坐标是成对出现的,所以可以vector<pair<int, int>>
进行存储。
3.AC代码
#include <iostream>
#include <vector>
using namespace std;
vector<pair<int, int>> lines(n);
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> lines[i].first >> lines[i].second;
}
int sx,sy,tx,ty;
cin>>sx>>sy>>tx>>ty;
int cscc = 0;
for (auto line : lines) { //自动匹配数据类型遍历每条线
int t=line.first;
int k=line.second;
if (t == 1) { //x=k的直线
if (k == sx || k == tx || (sx < k && k < tx) || (tx < k && k < sx)) {
cscc++;
}
} else { //y=k的直线
if (k == sy || k == ty || (sy < k && k < ty) || (ty < k && k < sy)) {
cscc++;
}
}
}
cout<<cscc<<endl;
return 0;
}

浙公网安备 33010602011771号