洛谷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;
}

posted @ 2025-08-18 19:14  nebula_walk  阅读(16)  评论(0)    收藏  举报