CCF窗口

原题链接

链接: 官网链接

解题思路

  1. 整一个全局数组area,里面存放该位置处的最顶层的窗口编号;
  2. 整一个结构体数组window,结构体Window里存放每一个窗口的x1, y1, x2, y2;读入时遍历这一块area,将其设为窗口的编号;
  3. 对于每次鼠标点击的坐标(x,y),area[x][y]就是该位置最顶层的窗口编号了,直接输出area[x][y]即可,记得再遍历该窗口范围内的area,将其设为该窗口编号,就是进行一次覆盖的过程;

C/C++代码

#include<iostream>
using namespace std;
const int maxn = 2700;
int n,m;
int area[maxn][maxn];
struct Window{
	int x1;
	int y1;
	int x2;
	int y2;
}window[12];
int main(){
	fill(area[0], area[0]+maxn*maxn, 0);
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++){
		//将编号为i(1~n)的窗口范围存起来 
		scanf("%d%d%d%d",&window[i].x1,&window[i].y1,&window[i].x2,&window[i].y2);
		//将该窗口范围的area值设为窗口编号 
		for(int x=window[i].x1; x<=window[i].x2; x++){
			for(int y=window[i].y1; y<=window[i].y2; y++){
				area[x][y] = i;
			}
		}
	}
	int x,y,id;
	while(m--){
		scanf("%d%d",&x,&y);
		id = area[x][y];
		//area[x][y]即为答案 
		if(id == 0){
			printf("IGNORED\n");
		}
		else{
			printf("%d\n",id);
			//记得要用该窗口重新覆盖一遍,即设为顶层窗口的过程 
			for(int x=window[id].x1; x<=window[id].x2; x++){
				for(int y=window[id].y1; y<=window[id].y2; y++){
					area[x][y] = id;
				}
			}
		}
	}
	return 0;
}
发布了110 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40486952/article/details/103442001