CCF (HLJU 1180)点击窗口 (模拟)

1180: 点击窗口

Time Limit: 1 Sec  Memory Limit: 128 MB

Submit: 10  Solved: 3

[Submit][Status][Web
Board
]

Description

在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。

当你点击屏幕上一个点的时候,你就选择了处于被点击位置的最顶层窗口,并且这个窗口就会被移到所有窗口的最顶层,而剩余的窗口的层次顺序不变。如果你点击的位置不属于任何窗口,则系统会忽略你这次点击。

现在我们希望你写一个程序模拟点击窗口的过程。

Input

输入包含多组数据,以文件尾为结束。

数据的第一行有两个正整数,即 N 和 M。(1 ≤ N ≤ 30,1 ≤ M ≤ 30)

接下来 N 行按照从最下层到最顶层的顺序给出 N 个窗口的位置。 每行包含四个非负整数 x1, y1,
x2, y2,表示该窗口的一对顶点坐标分别为 (x1,
y1) 和 (x2, y2)。保证
x1 < x2,y1<y2。

接下来 M 行每行包含两个非负整数 x, y,表示一次鼠标点击的坐标。

题目中涉及到的所有点和矩形的顶点的 x, y 坐标不超过 10000。

Output

输出包括 M 行,每一行表示一次鼠标点击的结果。如果该次鼠标点击选择了一个窗口,则输出这个窗口的编号(窗口按照输入中的顺序从 1 编号到 N);如果没有,则输出"IGNORED"(不含双引号)。

Sample Input

3 4
0 0 4 4
1 1 5 5
2 2 6 6
1 1
0 0
4 4
0 5

Sample Output

2
1
1
IGNORED

解析:模拟电脑窗口的点击过程。其实只需要用结构体存一下各个窗口的初始编号和区域位置,然后每次点击,从当前最上面一层开始往下扫描,点击的点第一次落在的区域所在窗口,就是所点击到的窗口,这时候把该窗口的初始编号输出,然后再把该窗口调整到最上面,对应程序也就是把当前窗口的结构体移动到结构体数组的最前面,再把他前面的结构体往后串。重复以上操作,m次结束即可。

AC代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

typedef struct node{
    int x1, y1, x2, y2;
}Node;
Node node[32];                //窗口结构体数组
int a[32];                    //保存各个窗口的上下关系

int main(){
//    freopen("in.txt", "r", stdin);
    int n, m, x, y;
    while(scanf("%d%d", &n, &m)!=EOF){
        memset(a, 0, sizeof(a));
        memset(node, 0, sizeof(node));
        for(int i=1; i<=n; i++)
            scanf("%d%d%d%d", &node[i].x1, &node[i].y1, &node[i].x2, &node[i].y2);
        for(int i=1; i<=n; i++) a[i] = n-i+1;
        for(int i=0; i<m; i++){
            scanf("%d%d", &x, &y);
            int flag = 0;
            for(int j=1; j<=n; j++){
                int foo = a[j];
                if(x >= node[foo].x1 && x <= node[foo].x2 && y >= node[foo].y1 && y <= node[foo].y2){      //如果点击的位置落在该窗口
                    printf("%d\n", foo);
                    flag = 1;
                    for(int k=j; k>=2; k--) a[k] = a[k-1];            //调整各窗口相对上下位置
                    a[1] = foo;
                    break;
                }
            }
            if(!flag) puts("IGNORED");
        }
    }
    return 0;
}

体会:其实这题大一的时候时候就见过,只不过当时太水了,没能写出来,而且开始的时候想了一个不动脑子的方法,保存所有屏幕的窗口编号,按重叠关系,把它们标号,但是结果却超内存了。后来才想到这样做的~~~

时间: 2024-10-12 18:09:19

CCF (HLJU 1180)点击窗口 (模拟)的相关文章

首届CCF真题2-窗口

问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴 分别平行的矩形区域.窗口的边界上的点也属于该窗口.窗口之间有层次 的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内 容. 当你点击屏幕上一个点的时候,你就选择了处于被点击位置的最顶层 窗口,并且这个窗口就会被移到所有窗口的最顶层,而剩余的窗口的层次 顺序不变.如果你点击的位置不属于任何窗口,则系统会忽略你这次点击. 现在我们希望你写一个程序模拟点击窗口的过程. 输入格式 输入的第一行有两个正整数,即 N

win7 dos窗口模拟帧刷新

前几天是白色情人节,临时脑抽写了个表白神器 高端大气上档次,就是不知道该送给谁,经过两天的反射弧思考决定还是写给博客娘吧.- -~ 这个程序就是打开后,在Dos窗口内模拟写出几行字母.其实主要就是模拟一下帧刷新.像游戏引擎那样每一帧都打印一个满屏,那么所有的动画也就出来了.想在里边写个小游戏也未尝不可. 但是理想丰满现实骨感,Dos窗口不断帧刷新效果很一般,是不是会出现跳动的情况,很蛋疼. win7 dos窗口的默认宽度是80个字符,高度是25个字符.经过简单的处理,通过调用Sleep函数来控制

CCF 201403-3 命令行选项 (STL模拟)

问题描述 请你写一个命令行分析程序,用以分析给定的命 令行里包含哪些选项.每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔.这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序 不用对它进行处理.在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数. 选项有两类:带参数的选项和不带参数的选项.一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-a" 或"-b".而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求

DS队列----银行单队列多窗口模拟

题目描述 假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可选择时,假设顾客总是选择编号最小的窗口. 本题要求输出前来等待服务的N位顾客的平均等待时间.最长等待时间.最后完成时间. 输入 输入第1行给出正整数N(≤),为顾客总人数:随后N行,每行给出一位顾客的到达时间T和事务处理时间P,并且假设输入数据已经按到达时间先后排好了顺序:最后一行给出正整数K(≤),为开设的营业窗口数. 输出 在一行中输出平

C# 点击窗口任意位置拖动

代码: 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Runtime.InteropServices; 8 using System.Text; 9 using System.Threading.Tasks; 10 u

CCF 201509-3 模板生成系统 (STL+模拟)

问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的.例如,对于展示用户信息的页面,当用户为 Tom 时,网页的源代码是 而当用户为 Jerry 时,网页的源代码是 这样的例子在包含动态内容的网站中还有很多.为了简化生成网页的工作,成成觉得他需要引入一套模板生成系统. 模板是包含特殊标记的文本.成成用到的模板只包含一种特殊标记,格式为 {{ VAR }},其中 VAR 是一个变量.该标记在模板生成时会被变量 VAR 的值所替代.例如,如果

CCF 全国信息学奥林匹克联赛复赛模拟

提高组08:30-12:00(请选手务必仔细阅读本页内容)一.题目概况 fib equal tree fib equal tree fib.in equal.in tree.in fib.out equal.out tree.out 1 秒 1 秒 1 秒 20 20 20 5 5 5 无 无 无 全文比较(过滤行末空格及文末回车) 传统 传统 传统 64M 64M 64M 二.提交源程序文件名 fib.c equal.c tree.c fib.pas equal.pas tree.pas 三.

CCF 201403-2 窗口 (STL模拟)

问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域.窗口的边界上的点也属于该窗口.窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容. 当你点击屏幕上一个点的时候,你就选择了处于被点击位置的最顶层窗口,并且这个窗口就会被移到所有窗口的最顶层,而剩余的窗口的层次顺序不变.如果你点击的位置不属于任何窗口,则系统会忽略你这次点击. 现在我们希望你写一个程序模拟点击窗口的过程. 输入格式 输入的第一行有两个正整数,即 N 和 M.(

窗口点击模拟a

[问题描述] 在计算机屏幕上,有N 个窗口.窗口的边界上的点也属于该窗口.窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容.当你用鼠标点击屏幕上一个点的时候,若其在窗口内,你就选择了处于被点击位置所属的最顶层窗口,并且这个窗口就会被移到所有窗口的最顶层,而剩余的窗口的层次顺序不变.如果你点击的位置不属于任何窗口,则系统会忽略你这次点击.编写一个程序模拟点击窗口的过程:先从标准输入读入窗口的个数,窗口编号和位置(以窗口的左上角和右下角的坐标表示,先输入的窗口层次高)