实习笔试题,画线
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小王最近在开发一种新的游戏引擎,但是最近遇到了性能瓶颈。于是他打算从最基本的画线功能开始分析优化。画线其实就是调用一次drawline命令,根据给出的两端坐标,在屏幕画出对应的线段。但是小王发现,很多的drawline其实可以合并在一起,譬如下图中的线段(2,3)-(4,5)和线段(3,4)-(6,7),其实可以合并为一次drawline命令,直接画出线段(2,3)-(6,7)。当然有些线段是无法合并的,如线段(-3,8)-(1,8)和线段(3,8)-(6,8),就必须调用两次drawline命令。

给出N条drawline指令以及对应的线段坐标,小王想知道,实际最少用多少次drawline指令就可以画出来。
小王想先从最简单的情况开始分析优化,所以线段只包含四种情况:水平线段,垂直线段以及正反45度的线段。
输入
每个输入数据包含多个测试点。
第一行为测试点的个数 S ≤ 10。之后是 S 个测试点的数据。
每个测试点的第一行为 N(N ≤ 105)。之后是 N 行,每行包含4个整数:x0, y0, x1, y1,表示线段(x0,y0)-(x1,y1),坐标的范围在[-108, 108],保证线段的长度大于0。
输出
对于每个测试点,对应的结果输出一行,表示最少用多少次指令即可完成所有的画线。
样例输入
2 4 3 8 6 8 -3 8 1 8 2 3 4 5 3 4 6 7 5 1 1 2 2 2 2 3 3 3 3 4 2 4 2 5 1 1 0 100 0
样例输出
3 3
#include<iostream>
#include<vector>
#include<set>
using namespace std;
int max(int a, int b) {
return a > b ? a : b;
}
int min(int a, int b) {
return a < b ? a : b;
}
struct A{
int x1, x2;
float k;
A() {};
A(int a, int b, int c, int d) {
x2 = max(a, c);
x1 = (a + c) - x2;
k = (d - b + 0.0) / (c - a);
}
A(int a, int b, float c) {
x1 = a;
x2 = b;
k = c;
}
};
int hebing(A &a, A b) {
if (((a.x2 >= b.x1) && (a.x1 <= b.x1)) || ((a.x1 <= b.x2) && (a.x2 >= b.x2))) {
A temp(min(a.x1, b.x1), max(a.x2, b.x2), a.k);
a = temp;
return 0;
}
else return 1;
}
int jisuan(vector<A>vec) {
for (int i = 0; i != vec.size(); ++i) {
for (int j = i; j != vec.size(); ++j) {
int c = hebing(vec[i], vec[j]);
if (c == 0)vec[j] = vec[i];
}
}
set<int>m;
for (int i = 0; i != vec.size(); ++i) {
m.insert(vec[i].x1);
}
return m.size();
}
int main() {
int a; vector<int>vec;
while (cin >> a) {
vec.clear();
while (a--) {
int b; cin >> b; vector<A>vec2;
for (int i = 0; i != b; ++i) {
int c, d, e, f;
cin >> c >> d >> e >> f;
vec2.push_back(A(c, d, e, f));
}
set<int>m;
for (int i = 0; i != vec2.size(); ++i) {
m.insert(vec2[i].k);
}
vector<A>vec4;
vector<vector<A>>vec3;
for (auto it = m.begin(); it != m.end(); ++it) {
vec4.clear();
for (int i = 0; i != vec2.size(); ++i) {
if (vec2[i].k == *it)vec4.push_back(vec2[i]);
}
vec3.push_back(vec4);
}
int num = 0;
for (int i = 0; i != vec3.size(); ++i) {
num += jisuan(vec3[i]);
}
vec.push_back(num);
}
for (int i = 0; i != vec.size(); ++i) {
cout << vec[i] << endl;
}
}
}
浙公网安备 33010602011771号