CCF 201403-2 窗口

这篇博客介绍了一个使用C++实现的程序,该程序通过结构体数组存储矩形窗口的排序,按照窗口从下到上的顺序排列。当鼠标点击时,程序会遍历窗口判断点击位置,若点击在某窗口内,则将该窗口移动到最上方,其他窗口顺序不变。如果未命中任何窗口,输出IGNORED。示例展示了不同点击位置下的窗口排序变化。
摘要由CSDN通过智能技术生成

1. 问题描述

在这里插入图片描述

2. 解题思路

typedef struct {  // 矩形窗口类
    int x1;
    int y1;
    int x2;
    int y2;
    int index; // 矩形窗口的编号
} Rectangle;

利用结构体数组存储窗口的排序情况,按照顺序最底下的窗口位于数组下标最小的位置(rect[0]),最顶上的窗口位于数组下标最大的位置(rect[n-1])
每次鼠标点击时,按照窗口从上到下的顺序依次判断鼠标是否落入窗口内,若是,则输出窗口编号,并且窗口排序情况重新排序,被点中的窗口移到最顶上(顺序表的位置改变),其他顺序不变。否则继续往下遍历。最后如果都没有窗口命中,则输出 IGNORED

画出样例中的窗口排列如下:

在这里插入图片描述
点击(1, 1) 的时候鼠标落在二号窗口上,并且二号窗口会移动到最上层如下:
在这里插入图片描述
然后下层是三号,最下层是1号窗口
点击(0, 0) 的时候鼠标落在一号窗口,并一号窗口移动到最前边
在这里插入图片描述
这时点击(4, 4) 依旧落在一号窗口,一号窗口保持最前。
点击(0, 5)未命中任何窗口,输出 IGNORED

3. 代码实现

#include<iostream>
using namespace std;

#define MAX_N 15
#define MAX_M 15


typedef struct {  // 矩形窗口类
    int x1;
    int y1;
    int x2;
    int y2;
    int index; // 矩形窗口的编号
} Rectangle;

Rectangle rect[MAX_N];

int n, m;
int x, y;
int flag = 0;


int main() {
    cin>>n>>m;

    // 将所有窗口存入一个数组,下标小的表示在最底层,下标大的表示在顶层
    for (int i = 0;i < n;i++) {
        cin>>rect[i].x1>>rect[i].y1>>rect[i].x2>>rect[i].y2;
        rect[i].index = i+1;
    }

    for (int i = 0;i < m;i++) {
        flag = 0;
        cin>>x>>y;
        for (int j = n-1;j >= 0;j--) {  // 倒着遍历窗口数组,因为窗口数组下表越大,窗口排列越靠上。
            // 判断点是否在窗口内
            if ( x >= rect[j].x1 && x<= rect[j].x2 && y >= rect[j].y1 && y <= rect[j].y2 ) {
                flag = 1;
                cout<<rect[j].index<<endl;

                // 在这里,如果该点点中了某个窗口,那么这个窗口就要排到最前面
                Rectangle temp;
                temp = rect[j];
                for (int k = j+1;k < n;k++) {
                    rect[k-1] = rect[k];
                }
                rect[n-1] = temp;

                break;
            }
        }
        if (!flag) {
            cout<<"IGNORED"<<endl;
        }
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值