今天又做了一个题目,这个感觉比昨天的复杂一些,代码量都多了一些。
题目是这样的,要求输入一系列点坐标,一共输入16个整型,两个两个一对,就是8个坐标,再两个两个一对,就是4条线段,判断这4条线段,是否围成一个矩形。
想了下,大概分为如下几个步骤来做:
1. 获取输入,组织数据结构,怎么存储这些点,这些线段。
2. 然后就是怎么判断矩形。
怎么判断矩形?我又分为下面几个步骤来考虑:
1. 先判断四条线段是否首尾相连在一起。可以判定图形是否是封闭图形。
2. 四条线段中对于任意一条线段与其非相邻线段是否平行。做两次平行判断,可以判定为平行四边形。
3. 在平行四边形的基础上,判断任意两条相邻的线段是否垂直。有垂直就是直角了,也就是矩形。
4. 判断每一条线段的长度都不为0。
首先我是自定了一些数据结构来存储输入的数据,Point, Line, Rectangle, RectangleSet。
然后通过输入获取了点的信息后,需要做一个首尾相连的判断。我的基本思路是,首先将第一条线段作为起始线段,任意选一个端点作为last端点。然后遍历剩下的线段,判断每一条线段中的两个端点是否与last端点相同,如果相同,就把这条线段的另一个端点赋值给last端点,这样两条线段就连接上了,最后循环结束后,判断下第一条线段的另一个端点与最后不断赋值得到的last端点是否是同一个点,就完事了。
在这个遍历的过程中,我添加了一个order的属性,第一条起始线段order为1,其他的order为-1,当发现一条与第一条相连的线段是,将其order值改为2,依序进行,就按顺序将首尾相连的线段标记为1,2,3,4的order值了。
有了order值后,如果图形是个首尾相连的封闭图形,那么就判断平行了,有了order值就很方便,只需要判断1与3是否平行,2与4是否平行即可。
平行如果也达成了,那么就随便判断1与2是否是垂直关系就好了。
最后再判断下每条线段是否为0长度,这样就可以判断是否是矩形了。
因为是用C++写的,各种坑啊……VS调试起来也不熟练。
代码如下:
/*
输入四个点,判断是否是矩形
*/
#include<iostream>
using namespace std;
class Point {
public:
int x, y = -1; //默认值负一
Point() {}
~Point() {}
bool equals (Point p) {
if (p.x == x && p.y == y) {
return true;
} else {
return false;
}
}
};
class Line {
public:
Po