本文采用類似棧的方法求解窗口問題舌镶,即彈出的不一定為棧頂?shù)脑刂梗鵀榉蠗l件的棧中元素,彈出后再進棧餐胀,成為新的棧頂元素
【問題描述】
在某圖形操作系統(tǒng)中哟楷,有N個窗口,每個窗口都是一個兩邊與坐標軸分別平行的矩形區(qū)域否灾。窗口的邊界上的點也屬于該窗口卖擅。窗口之間有層次的區(qū)別,在多于一個窗口重疊的區(qū)域里墨技,只會顯示位于頂層的窗口里的內容惩阶。
當你點擊屏幕上一個點的時候,你就選擇了處于被點擊位置的最頂層窗口扣汪,并且這個窗口就會被移到所有窗口的最頂層断楷,而剩余的窗口的層次順序不變。如果你點擊的位置不屬于任何窗口崭别,則系統(tǒng)會忽略你這次點擊脐嫂。
現(xiàn)在我們希望你寫一個程序模擬點擊窗口的過程。
【輸入形式】
輸入的第一行有兩個正整數(shù)紊遵,即N和M账千。(1≤N≤10,1≤M≤10)接下來N行按照從最下層到最頂層的順序給出N個窗口的位置暗膜。每行包含四個非負整數(shù)x1,y1,x2,y2匀奏,表示該窗口的一對頂點坐標分別為(x1,y1)和(x2,y2)。保證x1<x2学搜,y1<y2娃善。
接下來M行每行包含兩個非負整數(shù)x,y论衍,表示一次鼠標點擊的坐標。題目中涉及到的所有點和矩形的頂點的x,y坐標分別不超過2559和1439聚磺。
【輸出形式】
輸出包括M行坯台,每一行表示一次鼠標點擊的結果。如果該次鼠標點擊選擇了一個窗口瘫寝,則輸出這個窗口的編號(窗口按照輸入中的順序從1編號到N)蜒蕾;如果沒有,則輸出"IGNORED"(不含雙引號)焕阿。
【樣例輸入】
3 4
0 0 4 4
1 1 5 5
2 2 6 6
1 1
0 0
4 4
0 5
【樣例輸出】
2
1
1
IGNORED
【樣例說明】
第一次點擊的位置同時屬于第1和第2個窗口咪啡,但是由于第2個窗口在上面,它被選擇并且被置于頂層暮屡。
第二次點擊的位置只屬于第1個窗口撤摸,因此該次點擊選擇了此窗口并將其置于頂層。現(xiàn)在的三個窗口的層次關系與初始狀態(tài)恰好相反了褒纲。第三次點擊的位置同時屬于三個窗口的范圍准夷,但是由于現(xiàn)在第1個窗口處于頂層,它被選擇莺掠。
最后點擊的(0,5)不屬于任何窗口冕象。
【評分標準】
完整代碼如下:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10000
struct Window
{
int Wx1;
int Wy1;
int Wx2;
int Wy2;
}window[MAXSIZE];//窗口數(shù)據(jù)
struct Mouse
{
int Mx;
int My;
}mouse[MAXSIZE];//鼠標點擊數(shù)據(jù)
int main()
{
int *b = (int*)malloc(MAXSIZE * sizeof(int));//定義棧
int base = 0;
int top = base;
int n, m;
scanf("%d", &n);
scanf("%d", &m);
for (int i = 0; i < n; i++)
{
scanf("%d", &window[i].Wx1);
scanf("%d", &window[i].Wy1);
scanf("%d", &window[i].Wx2);
scanf("%d", &window[i].Wy2);
b[top] = i;
top = top + 1;
}
for (int i = 0; i < m; i++)
{
scanf("%d", &mouse[i].Mx);
scanf("%d", &mouse[i].My);
}
int flag = 0;//標志判斷是否在某個窗口內
for (int i = 0; i < m; i++)
{
top = n - 1;
flag = 0;
for (int j = 0; j < n; j++)
{
if ((mouse[i].Mx >= window[b[top]].Wx1) && (mouse[i].Mx <= window[b[top]].Wx2) && (mouse[i].My >= window[b[top]].Wy1) && (mouse[i].My <= window[b[top]].Wy2))
{
flag = 1;//在某個窗口內
int temp = b[top];//記錄該棧頂?shù)脑? for (int k = top; k < n - 1; k++)//把棧里該元素后面的元素依次向前移
{
b[k] = b[k + 1];
}
b[n - 1] = temp;//棧頂元素記為此元素,便于下次判斷
break;
}
top = top - 1;
}
if (flag == 0)
{
printf("IGNORED\n");
}
else
{
printf("%d\n", b[n - 1] + 1);//輸出棧頂元素編號
}
}
return 0;
}
end~~~