题目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"。同时,我们还需要根据实际情况修改遍历指令集的范围,以避免机器猫在遇到障碍物后继续移动。
希望这个算法对解决问题有所帮助!