CSP 窗口

原文鏈接

我的個人博客

原題鏈接

窗口

思路

給定一個點,很容易判斷是否屬於某個窗口。在這裏,用結構體存放窗口的信息,包括窗口id和窗口排列的優先級,用z值的大小表示,z值越大,就越排在vector的前面。
從最上面的窗口開始判斷點擊的位置是否屬於該窗口,一旦查詢到屬於某個窗口,則將該窗口的z值變成最大的。這裏用++n保證,最新點擊的z值是最大的。

代碼

#include <bits/stdc++.h>
using namespace std;

struct node{
	int id; 
	int x1,y1,x2,y2;
	int z;//z值越大,則越靠前 
	node(int i,int x11,int y11,int x22,int y22,int zz){
		id = i;
		x1 = x11;
		y1 = y11;
		x2 = x22;
		y2 = y22;
		z  = zz;
	}
};
bool cmp(const node&a,const node &b){
	return a.z>b.z;
}
bool isIn(int x,int y,node w){
	//判斷(x,y)是否在w窗口中 
	if(x >= w.x1 && x <= w.x2 && y >= w.y1 && y <= w.y2){
		return true;
	}
	return false;
}
int main(){
	vector<node> v;
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int x1,y1,x2,y2;
		cin>>x1>>y1>>x2>>y2;
		v.push_back(node{i,x1,y1,x2,y2,i});
	} 
	for(int i=0;i<m;i++){
		int x,y;
		cin>>x>>y;
		sort(v.begin(),v.end(),cmp);//每次都保證z大的在最上面 
		bool isfind = false;
		for(int i=0;i<v.size();i++){
			if(isIn(x,y,v[i])){
				//在某個窗口上
				v[i].z = ++n; //優先級加一 
				cout<<v[i].id<<endl;
				isfind = true;
				break ; 
			} 
		}
		if(isfind == false){
			cout<<"IGNORED"<<endl;
		}		
	}

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章