问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。 输入格式 输入的第一行有两个正整数,即 N 和 M。(1 ≤ N ≤ 10,1 ≤ M ≤ 10) 输出格式 输出包括 M 行,每一行表示一次鼠标点击的结果。如果该次鼠标点击选择了一个窗口,则输出这个窗口的编号(窗口按照输入中的顺序从 1 编号到 N);如果没有,则输出"IGNORED"(不含双引号)。 样例输入 3 4 样例输出 2 样例说明 第一次点击的位置同时属于第 1 和第 2 个窗口,但是由于第 2 个窗口在上面,它被选择并且被置于顶层。 |
思路很简单,一个编号位,一个窗口上下位
没有坑,放心写。
另外我发现正常用sort(lst,cmp)在系统里是会报错的,记得添上#include<algorithm>,之前公共钥匙盒那边遇到的也是这个问题。
python
import functools
n,m=map(int,input().split())
windows=[]
click=[]
for i in range(n):
x1,y1,x2,y2=map(int,input().split())
windows.append([x1,y1,x2,y2,i+1,n-i])
for i in range(m):
x,y=map(int,input().split())
click.append([x,y])
def cmp(a,b):
if(a[-1]>b[-1]):
return 1
return -1
def cout(lst):
windows.sort(key=functools.cmp_to_key(cmp))
for j in windows:
if(lst[0]>=j[0] and lst[0]<=j[2] and lst[1]>=j[1] and lst[1]<=j[3]):
for k in windows:
if(k[-1]<j[-1]):
k[-1]=k[-1]+1
else:
break
print(windows)
j[-1]=1
return j[-2]
return "IGNORED"
for i in click:
print(cout(i))
c++
#include <iostream>
#include <algorithm>
using namespace std;
int n,m;
struct window{
int x1;
int y1;
int x2;
int y2;
int no;
int posi;
};
struct click{
int x;
int y;
};
int cmp(window a,window b){
if(a.posi>b.posi){
return 0;
}
return 1;
}
int findwindow(window lst[],click c){
sort(lst,lst+n,cmp);
for(int j=0;j<n;++j){
if(c.x>=lst[j].x1 and c.x<=lst[j].x2 and c.y>=lst[j].y1 and c.y<=lst[j].y2){
return j;
}
}
return -1;
}
int main(){
cin>>n>>m;
window windows[n];
click clicks[m];
for (int i=0;i<n;++i){
window tempwindow;
cin>>tempwindow.x1>>tempwindow.y1>>tempwindow.x2>>tempwindow.y2;
tempwindow.no=i+1;
tempwindow.posi=n-i;
windows[i]=tempwindow;
}
for(int i=0;i<m;++i){
click tempclick;
cin>>tempclick.x>>tempclick.y;
clicks[i]=tempclick;
}
for(int i=0;i<m;++i){
int num=findwindow(windows,clicks[i]);
if(num!=-1){
cout<<windows[num].no<<endl;
for(int k=0;k<n;++k){
if(windows[k].posi<windows[num].posi){
windows[k].posi=windows[k].posi+1;
}
else{
windows[num].posi=1;
break;
}
}
}
else{
cout<<"IGNORED"<<endl;
}
}
}