金山办公2020校招C++开发工程师笔试题(一)

本文探讨了计算机科学中的两个经典问题:裁剪二维平面中的线段和寻找网格上的最短路径字符串。通过具体示例,详细介绍了如何通过编程解决这些问题,包括算法设计和代码实现。

链接:https://www.nowcoder.com/test/21499425/summary

11、框选线段

在二维平面坐标系中,已知存在一条线段(图中P1->p2)和一个矩形区域,编程计算得出线段被矩形区域裁剪的新起始点。

注意以下要求:

A、线段是有方向的,裁剪得到的新线段也需要保持原线段的方向;下图中,线段的描述是P1->p2,则裁剪的结果是P3->p4,反之,如果线段描述是P2->P1,则结果是P4->P3
B、线段的起始点在矩形区域里面时,裁剪的结果则就是原始线段
C、当线段与矩形区域没有相交线段的时候,结果输出“-1”

#include <iostream>
using namespace std;
struct Point {
    float x, y;
};
struct Rect {
    Point leftBottom, rightTop;
    bool contain(const Point& pt) {
        return pt.x > leftBottom.x&& pt.x<rightTop.x && pt.y>leftBottom.y&& pt.y < rightTop.y;
    }
    void cut(Point& pt, const Point& dir) {       //根据方向向量将点裁剪到矩形上
        if (contain(pt))                       //如果点在矩形内,则不需要对它裁剪
            return;
        Point offset = { 1,dir.y / dir.x };      //确定水平方向,计算垂直方向的偏移
        if (pt.x > rightTop.x)
            pt = { rightTop.x,pt.y + offset.y * (rightTop.x - pt.x) };
        else if (pt.x < leftBottom.x)
            pt = { leftBottom.x,pt.y + offset.y * (leftBottom.x - pt.x) };
        offset = { dir.x / dir.y,1 };         //确定垂直方向,计算水平方向的偏移
        if (pt.y > rightTop.y)
            pt = { pt.x + offset.x * (rightTop.y - pt.y), rightTop.y };
        else if (pt.y < leftBottom.y)
            pt = { pt.x + offset.x * (leftBottom.y - pt.y), leftBottom.y };
    }
};
 
istream& operator>>(istream& in, Poin
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值