CSDN 编程竞赛六十二期题解

题目1、覆盖面积
给出二维平面上两个由直线构成且边与坐标轴平行或垂直的矩形,每个矩形由其左下和右上两个顶点坐标表示。第一个矩形由其左下顶点(ax1, ay1)和右上顶点(ax2, ay2)定义。第二个矩形由其左下顶点(bx1, by1)和右上顶点(bx2, by2)定义。请你计算并返回两个矩形覆盖的总面积。

#include<iostream>
using namespace std;
int main()
{
    int a,b,v1,c,d,v2;
    int ax1,ay1,ax2,ay2;
    int bx1,by1,bx2,by2;
    cin>>ax1>>ay1;
    cin>>ax2>>ay2;
    cin>>bx1>>by1;
    cin>>bx2>>by2;
    
    int a1=ax2-ax1;//长和宽 
    int a2=ay2-ay1;
    int b1=bx2-bx1;//长和宽 
    int b2=by2-by1;
   
    int m1,n1;
    int m2,n2;
    m1=max(min(ax1,ax2),min(bx1,bx2));
    n1=max(min(ay1,ay2),min(by1,by2));
    m2=min(max(ax1,ax2),max(bx1,bx2));
    n2=min(max(ay1,ay2),max(by1,by2));
    if(m2>m1&&n2>n1) 
        cout<<a1*a2+b1*b2-(m2-m1)*(n2-n1);//相交
    else 
        cout<<a1*a2+b1*b2;//相离
    return 0;
}

 本题输入数据格式描述十分奇怪,给出的输入数据为ax1 = xxx, ay1 = xxx, ax2 = xxx, ay2 = xxx, bx1 = xxx, by1 = xxx, bx2 = xxx, by2 = xxx,实际上的输入数据却只有8个数字,没有其余内容。

2、小光买了一个可编程机器猫,机器猫初始位置在原点(0, 0)。 小伙伴事先给机器猫输入一串指令command,机器猫就会无限循环这条指令的步骤进行移动。指令有两种: U: 向y轴正方向移动一格 R: 向x轴正方向移动一格。 D: 向y轴负方向移动一格 L: 向x轴负方向移动一格。不幸的是,在 xy 平面上还有一些遮挡物,他们的坐标用 barriers 表示。机器猫一旦碰到遮挡物就会被损毁。 限制: 2 <= command的长度 <= 1000 command由 U,R,D,L构成(个数不限制) 0 <= x <= 1e9 0 <= y <= 1e9 0 <= barriers 的长度 <= 1000, barriers[i]不为原点或者终点
 

为了解决这个问题,我们可以按照给定的指令来模拟机器猫的移动,并检查每一步是否会碰到遮挡物。
首先,我们可以初始化机器猫的位置为原点(0, 0)。然后,我们根据指令逐步更新机器猫的位置,并检查每一步是否与任何一个遮挡物的位置重合。
具体的算法如下:
1. 初始化机器猫的位置为原点 (0, 0)。
2. 遍历指令集 command 中的每一个指令:
   - 如果指令是 "U",将机器猫的 y 坐标加 1。
   - 如果指令是 "R",将机器猫的 x 坐标加 1。
   - 如果指令是 "D",将机器猫的 y 坐标减 1。
   - 如果指令是 "L",将机器猫的 x 坐标减 1。
3. 在每一步更新机器猫的位置后,检查机器猫的位置是否与任何一个遮挡物的位置重合:
   - 如果重合,则输出 "false",表示机器猫被损坏。
4. 如果机器猫的位置离原点越来越远(根据曼哈顿距离判断),则输出 "false",表示机器猫无法到达终点。
5. 如果机器猫成功执行完指令集而没有与遮挡物重合,并且没有远离原点,则输出 "true",表示机器猫可以到达终点。
需要注意的是,这个算法仅适用于没有障碍物的情况。如果存在障碍物,我们需要修改第3步的检查,将机器猫的位置与每一个遮挡物的位置逐一比较,如果重合则输出 "false"。同时,我们还需要根据实际情况修改遍历指令集的范围,以避免机器猫在遇到障碍物后继续移动。
希望这个算法对解决问题有所帮助!


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code Slacker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值