1 条题解
-
0
#include <iostream> #include <vector> #include <string> #include <sstream> using namespace std; struct Rect { int l, t, r, b; }; struct Window { int id; Rect current; Rect original; bool zoomed; Window(int i, int l, int t, int r, int b) : id(i), zoomed(false) { original = current = (Rect){l, t, r, b}; } }; vector<Window> z_order; // from back to front int next_id = 0; bool point_in_rect(int x, int y, Rect r) { return x >= r.l && x <= r.r && y >= r.t && y <= r.b; } bool in_box(int x, int y, Rect r, string area) { if (area == "close") return x >= r.l && x < r.l + 25 && y >= r.t && y < r.t + 25; if (area == "zoom") return x > r.r - 25 && x <= r.r && y >= r.t && y < r.t + 25; if (area == "motion") return x >= r.l + 25 && x <= r.r - 25 && y >= r.t && y < r.t + 25; return false; } int selected = -1; int down_x = -1, down_y = -1; string mode = ""; // "close", "zoom", "move" int move_start_x, move_start_y; void move_to_top(int id) { for (size_t i = 0; i < z_order.size(); ++i) { if (z_order[i].id == id) { Window w = z_order[i]; z_order.erase(z_order.begin() + i); z_order.push_back(w); break; } } } void create(int l, int t, int r, int b) { Window w(next_id, l, t, r, b); z_order.push_back(w); cout << "Created window " << next_id << " at " << l << ", " << t << ", " << r << ", " << b << endl; ++next_id; } void redraw() { for (size_t i = 0; i < z_order.size(); ++i) { Window w = z_order[i]; Rect r = w.current; cout << "Window " << w.id << " at " << r.l << ", " << r.t << ", " << r.r << ", " << r.b << endl; } } void dn(int x, int y) { for (int i = (int)z_order.size() - 1; i >= 0; --i) { Window &w = z_order[i]; if (point_in_rect(x, y, w.current)) { selected = w.id; move_to_top(selected); cout << "Selected window " << selected << endl; Window &win = z_order.back(); if (in_box(x, y, win.current, "close")) mode = "close"; else if (in_box(x, y, win.current, "zoom")) mode = "zoom"; else if (in_box(x, y, win.current, "motion") && !win.zoomed) { mode = "move"; move_start_x = x; move_start_y = y; } else { mode = ""; } down_x = x; down_y = y; return; } } selected = -1; mode = ""; } void up(int x, int y) { if (selected == -1) return; Window &win = z_order.back(); if (mode == "close" && in_box(x, y, win.current, "close")) { cout << "Closed window " << win.id << endl; z_order.pop_back(); } else if (mode == "zoom" && in_box(x, y, win.current, "zoom")) { if (win.zoomed) { win.current = win.original; } else { win.current = (Rect){0, 0, 1023, 1023}; } win.zoomed = !win.zoomed; Rect r = win.current; cout << "Resized window " << win.id << " to " << r.l << ", " << r.t << ", " << r.r << ", " << r.b << endl; } else if (mode == "move") { int dx = x - move_start_x; int dy = y - move_start_y; win.current.l += dx; win.current.r += dx; win.current.t += dy; win.current.b += dy; Rect r = win.current; cout << "Moved window " << win.id << " to " << r.l << ", " << r.t << ", " << r.r << ", " << r.b << endl; } selected = -1; mode = ""; } void at(int x, int y) { if (selected == -1 || mode != "move") return; Window &win = z_order.back(); int dx = x - move_start_x; int dy = y - move_start_y; Rect r; r.l = win.current.l + dx; r.r = win.current.r + dx; r.t = win.current.t + dy; r.b = win.current.b + dy; cout << "Moved window " << win.id << " to " << r.l << ", " << r.t << ", " << r.r << ", " << r.b << endl; } int main() { string line; while (getline(cin, line)) { if (line == "ZZ") break; stringstream ss(line); string cmd; ss >> cmd; if (cmd == "CR") { int l, t, r, b; ss >> l >> t >> r >> b; create(l, t, r, b); } else if (cmd == "DN") { int x, y; ss >> x >> y; dn(x, y); } else if (cmd == "UP") { int x, y; ss >> x >> y; up(x, y); } else if (cmd == "AT") { int x, y; ss >> x >> y; at(x, y); } else if (cmd == "RE") { redraw(); } } return 0; }
- 1
信息
- ID
- 568
- 时间
- 1000ms
- 内存
- 10MiB
- 难度
- 6
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者