問題描述
在某圖形操作系統中,有 N 個窗口,每個窗口都是一個兩邊與座標軸分別平行的矩形區域。窗口的邊界上的點也屬於該窗口。窗口之間有層次的區別,在多於一個窗口重疊的區域裏,只會顯示位於頂層的窗口裏的內容。
當你點擊屏幕上一個點的時候,你就選擇了處於被點擊位置的最頂層窗口,並且這個窗口就會被移到所有窗口的最頂層,而剩餘的窗口的層次順序不變。如果你點擊的位置不屬於任何窗口,則系統會忽略你這次點擊。
現在我們希望你寫一個程序模擬點擊窗口的過程。
當你點擊屏幕上一個點的時候,你就選擇了處於被點擊位置的最頂層窗口,並且這個窗口就會被移到所有窗口的最頂層,而剩餘的窗口的層次順序不變。如果你點擊的位置不屬於任何窗口,則系統會忽略你這次點擊。
現在我們希望你寫一個程序模擬點擊窗口的過程。
輸入格式
輸入的第一行有兩個正整數,即 N 和 M。(1 ≤ N ≤ 10,1 ≤ M ≤ 10)
接下來 N 行按照從最下層到最頂層的順序給出 N 個窗口的位置。 每行包含四個非負整數 x1, y1, x2, y2,表示該窗口的一對頂點座標分別爲 (x1, y1) 和 (x2, y2)。保證 x1 < x2,y1 2。
接下來 M 行每行包含兩個非負整數 x, y,表示一次鼠標點擊的座標。
題目中涉及到的所有點和矩形的頂點的 x, y 座標分別不超過 2559 和 1439。
接下來 N 行按照從最下層到最頂層的順序給出 N 個窗口的位置。 每行包含四個非負整數 x1, y1, x2, y2,表示該窗口的一對頂點座標分別爲 (x1, y1) 和 (x2, y2)。保證 x1 < x2,y1 2。
接下來 M 行每行包含兩個非負整數 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
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
1
IGNORED
樣例說明
第一次點擊的位置同時屬於第 1 和第 2 個窗口,但是由於第 2 個窗口在上面,它被選擇並且被置於頂層。
第二次點擊的位置只屬於第 1 個窗口,因此該次點擊選擇了此窗口並將其置於頂層。現在的三個窗口的層次關係與初始狀態恰好相反了。
第三次點擊的位置同時屬於三個窗口的範圍,但是由於現在第 1 個窗口處於頂層,它被選擇。
最後點擊的 (0, 5) 不屬於任何窗口。
第二次點擊的位置只屬於第 1 個窗口,因此該次點擊選擇了此窗口並將其置於頂層。現在的三個窗口的層次關係與初始狀態恰好相反了。
第三次點擊的位置同時屬於三個窗口的範圍,但是由於現在第 1 個窗口處於頂層,它被選擇。
最後點擊的 (0, 5) 不屬於任何窗口。
思路:這道題有三點:
首先確認窗口,窗口選擇,窗口變動。
1、確認窗口。即確認應該選擇哪一個座標
2、窗口選擇。怎麼確定選擇哪個窗口,同時輸出
3、窗口的變動。即將窗口放到最上面
針對上面三個問題,我分別這樣做:
1、對第一個問題,將當前的點與窗口依次進行比較。
由於窗口已經是變動過的窗口,按照窗口從0到結束依次進行比較,這時就是由底向頂比較的過程。
2、編寫paixu函數。這個函數其實就是將確認的窗口與最原始的窗口進行比較,如果座標的四個值相等,即可確認是那個窗口。原始窗口我用window1表示。
有一點要注意,由於這個函數是循環比較,並且有賦值行爲,所以只能比較一次,不然就會出現重複相等的情況,所以用break來阻斷後面的循環。
3、這個步驟和數據結構中的鏈表用些相似,但是我沒用,直接編寫了。即把選定的窗口的值賦給temp,再將選定窗口之後的窗口前移一位,再將temp放到最後。
這道題,難度有些大感覺。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc =new Scanner(System.in);
int N=sc.nextInt();
int M=sc.nextInt();
int[][] window=new int[N][4];
int[][] window1=new int[N][4];
int[][] arr=new int[M][2];
for(int i=0;iup)
{
up=t;
}
}
}
if(up!=-1)
{
paixu(window,window1,up,N);
up(window,up,N);
}
else
{
System.out.println("IGNORED");
}
}
}
public static void up(int[][] window,int up,int N)
{
int[] temp=new int[1000];
temp=window[up];
for(int i=up;i
對了,還有一點,IGNORED一定要寫對,我第一次少寫了一個D,結果只剩20分,寫上就滿分了。扣分好嚴重……