思路
看到题目中不同的窗口,就想到用类来定义,因为每个窗口都有自己的四个顶点的坐标,窗口的编号和窗口的优先级。读完题后,点了几下桌面窗口,本想着模拟一遍点击过程来做题,就是下面窗口的面积为原面积减去被遮住的部分,但是每次窗口的大小都在不断变化实在不知道该怎么办。
后来意识到根本不需要纠结窗口的大小变化,只需要每次点击都验证所有的窗口是否被点击到,最后把优先级最高的给输出就行。至于当前窗口的层次,只需要设置一个优先级参数即可。我需要做的,只有每次改变一下各个窗口的优先级,让原本在选中页面之上的窗口的优先级减一
问题
一开始思路有问题,
思路滤清后错了几次,原因是没有满足题目要求的 “如果你点击的位置不属于任何窗口,则系统会忽略你这次点击 ”
,在最后的else后加了个{ }终于做对。
#include <iostream>
using namespace std;
class windows
{
public:
windows()
{
x1 = 0;
x2 = 0;
y1 = 0;
y2 = 0;
level = 0; //优先级
num = 0; //序号
//flag = 0;
}
~windows() {}
public:
int x1,x2,y1,y2;
int level,num;
};
int main()
{
windows win[10];
int x, y;
int n, m;
//scanf ("%d %d",&n, &m);
cin >> n>> m;
for (int i = 0; i<n; i++) //输入
{
cin >>win[i].x1>>win[i].y1>>win[i].x2>>win[i].y2;
win[i].num = i + 1;
win[i].level = i + 1;
}
for (int i = 0; i< m; i++) ///大循环
{
cin >>x>>y;
int maxnum = 0, fnum = 0, fj;
int a= 0;
for (int j = 0; j<n; j++) ///遍历循环
{
if (win[j].x1<=x && win[j].x2>=x && win[j].y1<=y && win[j].y2>=y)
{
a++; //a用来统计是否有窗口被点到
if (maxnum < win[j].level)
{
maxnum = win[j].level;
fnum = win[j].num;
fj = j;
}
}
}
if(a == 0)
cout<<"IGNORED"<<"\n"; //没有窗口被点到
else //有窗口被点到
{
cout<<fnum<<"\n";
// for (int i = fj+1; i< n; i++) //这个思路错了,但是却对了,不知道为啥
// {
// win[i].level --;
// }
// win[fj].level = n;
for (int i = 0; i< n; i++) //遍历一遍,把原先在选中页面之上的优先级减一
{
if (win[i].level > maxnum)
win[i].level --;
}
win[fj].level = n; //选中页面的优先级设为最大
}
}
return 0;
}