实习笔试题,画线
时间限制: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; } } }