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; }