【CSP试题回顾】201403-2-窗口

本文介绍了如何使用C++实现一个窗口系统,通过结构体存储窗口信息,处理输入的窗口数量和点击事件,确保每次点击后,最近被点击的窗口位于列表顶层。
摘要由CSDN通过智能技术生成

CSP-201403-2-窗口

解题思路

  1. 窗口存储结构:首先,使用一个结构体MyWindow来存储每个窗口的信息,包括窗口的序号(index)和矩形区域的四个顶点坐标(x1, y1, x2, y2)。所有窗口的信息存储在一个向量windowList中。

  2. 输入处理:程序首先接收两个输入值N和M,N表示窗口的数量,M表示点击的数量。接着,程序通过循环读取每个窗口的坐标,并将它们添加到windowList向量中。之后,程序通过另一个循环读取每次点击的坐标。

  3. 点击事件处理:对于每个点击事件,程序从最后一个添加到windowList中的窗口开始逆序遍历,这样可以首先检查最上层的窗口。如果点击的点位于某个窗口的范围内,程序输出该窗口的序号,并将这个窗口移动到向量的末尾,表示这个窗口被移动到了所有窗口的最上层。如果点击的点不在任何窗口的范围内,程序输出“IGNORED”。

  4. 更新窗口顺序(重要):当一个窗口因为点击而被选中时,它会被从列表中移除(删除原有窗口),然后添加到列表的末尾(置于顶层)。这样确保了如果再有点击事件,最新被点击的窗口将会是第一个被检查的。

完整代码

#include <iostream>
#include <vector>
using namespace std;

struct MyWindow
{
	int index;
	int x1, y1, x2, y2;
};
int N, M;
vector<MyWindow>windowList;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> N >> M;

	// 输入窗口
	for (int i = 0; i < N; i++)
	{
		MyWindow t;
		t.index = i + 1;
		cin >> t.x1 >> t.y1 >> t.x2 >> t.y2;
		windowList.push_back(t);
	}

	// 输入鼠标点击记录
	for (int i = 0; i < M; i++)
	{
		int x, y;
		cin >> x >> y;
		bool isFind = 0; // 标记是否找到点击窗口 1-找到
		// 倒序遍历windowList(先找到序号最大的窗口即最顶部的窗口)
		for (int j = windowList.size() - 1; j >= 0; j--)
		{
			// 鼠标点击在该窗口内
			if (windowList[j].x1 <= x && x <= windowList[j].x2
				&& windowList[j].y1 <= y && y <= windowList[j].y2)
			{
				cout << windowList[j].index << endl;
				isFind = 1;
				
				MyWindow t = windowList[j];
				windowList.erase(windowList.begin() + j); // 删除原有窗口
				windowList.push_back(t); // 置于顶层
				break;
			}	
		}
		if (isFind == 0)
		{
			cout << "IGNORED\n";
		}
	}
    return 0;
}

请添加图片描述

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值