1 条题解

  • 0
    @ 2025-5-5 11:32:30
    #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
    上传者