【CCF-CSP】201403-2 窗口 C++



一、题目

窗口
窗口2

原题目链接

二、解题

1.思路

模拟窗口的排列和移动过程,给定的窗口具有不同的位置和大小。对于每个查询,程序需要找到包含给定坐标的窗口,并将其移到窗口列表的最前面。

代码思路:

  1. 读入窗口数量N和查询次数M,然后读入每个窗口的初始位置。
  2. 将窗口的编号压入整数向量V,该向量中的编号排列顺序为:最后一个窗口的编号在第一个,第一个窗口的编号在最后一个。
  3. 对于每个查询,读入坐标x和y,并迭代整数向量V,使用Judge_In函数检查它是否在当前窗口中。
  4. 如果找到包含(x,y)的窗口,则输出其编号,并将该编号存储在store中。将该编号从向量V中删除,并在开头插入,保证当前查询找到的窗口移动到窗口列表的开头。
  5. 如果未找到任何窗口,则输出“IGNORED”。

2.代码

dev c++ 5.11

#include<bits/stdc++.h>
using namespace std;
vector<int> V;
struct Area{
	int x1,y1;
	int x2,y2;
}Win_Area[15];
bool Judge_On(int x,int y,int no){
	if(x>=Win_Area[no].x1 && x<=Win_Area[no].x2 && y>=Win_Area[no].y1 && y<=Win_Area[no].y2){
		return true;
	}else{
		return false;
	}
}
int main(){
	int N,M;
	cin>>N>>M;
	for(int i=1;i<=N;i++){
		cin>>Win_Area[i].x1>>Win_Area[i].y1>>Win_Area[i].x2>>Win_Area[i].y2;
		V.push_back(N-i+1);//窗口从最下层开始存储
	}
	for(int i=0;i<M;i++){
		int x,y;
		cin>>x>>y;
		for(auto it=V.begin();it!=V.end();it++){
			if(Judge_On(x,y,*it)){
				cout<<*it<<endl;
				int temp=*it;
				V.erase(it);
				V.insert(V.begin(),temp);
				x=-1;
				break;
			}
		}
		if(x!=-1) cout<<"IGNORED"<<endl;
	}
	return 0;
}


3.提交结果

结果

总结

1.解释:

for(int i=0;i<M;i++){
		int x,y;
		cin>>x>>y;
		for(auto it=V.begin();it!=V.end();it++){
			if(Judge_On(x,y,*it)){
				cout<<*it<<endl;
				int temp=*it;
				V.erase(it);
				V.insert(V.begin(),temp);
				x=-1;
				break;
			}
		}
		if(x!=-1) cout<<"IGNORED"<<endl;
	}

遍历一个名为V的向量,每次读取一对整数x和y,如果在V中找到了满足Judge_In(x, y, *it)为真的元素,则将该元素移动到向量的开头。如果在V中没有找到这样的元素,则输出"IGNORED"。
其中,x=-1的作用是标记找到了一个匹配的元素,使用break退出循环,以避免未找到匹配的元素时还输出"IGNORED"。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值