问题描述
试题编号: | 201403-2 |
试题名称: | 窗口 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。 输入格式 输入的第一行有两个正整数,即 N 和 M。(1 ≤ N ≤ 10,1 ≤ M ≤ 10) 输出格式 输出包括 M 行,每一行表示一次鼠标点击的结果。如果该次鼠标点击选择了一个窗口,则输出这个窗口的编号(窗口按照输入中的顺序从 1 编号到 N);如果没有,则输出"IGNORED"(不含双引号)。 样例输入 3 4 样例输出 2 样例说明 第一次点击的位置同时属于第 1 和第 2 个窗口,但是由于第 2 个窗口在上面,它被选择并且被置于顶层。 |
答题栏
试题分析:使用链表实现,链表中保存窗户的编号、一对坐标,和下一个窗口的位置。链表从头到尾,存放从顶层到底层窗口位置,每次鼠标点击,从链表头部开始检索,鼠标点击的窗口位置,首次检索到的窗口即为鼠标点击的最上边的窗口,返回窗口编号,将鼠标点击的窗口移到链表头部。
import java.util.Scanner;
//链表结构
class Pos{
private int id;
private int x1;
private int y1;
private int x2;
private int y2;
private Pos next;
public int getX1() {
return x1;
}
public void setX1(int x1) {
this.x1 = x1;
}
public int getY1() {
return y1;
}
public void setY1(int y1) {
this.y1 = y1;
}
public int getX2() {
return x2;
}
public void setX2(int x2) {
this.x2 = x2;
}
public int getY2() {
return y2;
}
public void setY2(int y2) {
this.y2 = y2;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Pos getNext() {
return next;
}
public void setNext(Pos next) {
this.next = next;
}
}
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int N ,M ;
N = s.nextInt();
M = s.nextInt();
//ArrayList<pos> pp = new ArrayList<pos>();
Pos[] p =new Pos[N];
//int[][] a =new int[N][5];
Pos head=new Pos();
///录入窗口信息
int i;
for(i=0; i<N; i++) {
p[i] = new Pos();
p[i].setId(i+1); //窗口编号
p[i].setX1(s.nextInt());//x1
p[i].setY1(s.nextInt());//y1
p[i].setX2(s.nextInt());//x2
p[i].setY2(s.nextInt());//y2
if(i==0)
p[i].setNext(null);
else
p[i].setNext(p[i-1]);
}
head.setNext(p[i-1]);//最上边的窗口
int x, y; //(x,y)鼠标点击的位置
for(i=0; i<M; i++) {
x = s.nextInt();
y = s.nextInt();
Pos index=null;
//检索鼠标点击的窗口
for(index=head.getNext(); index!=null; index= index.getNext()) {
if(x >= index.getX1() && x <= index.getX2() && y >= index.getY1() && y <= index.getY2() ) {
System.out.println(index.getId()); //输出窗口编号
break;
}
}
///表示鼠标点击到所有窗口之外的位置
if(index==null) {
System.out.println("IGNORED");
continue;
}
//将点击的窗口移动到链表头部
///1、如果点击的是顶层的窗口,链表不需要移动
if(head.getNext()==index) {
continue;
}
///2、鼠标点击非顶层的窗口,将点击的窗口移到顶层
Pos index2 = null;
for(index2=head.getNext(); index2.getNext()!=index; index2=index2.getNext()) {
}
index2.setNext(index.getNext());
index.setNext(head.getNext());
head.setNext(index);
}
}
}