試題編號: | 201403-2 |
試題名稱: | 窗口 |
時間限制: | 1.0s |
內(nèi)存限制: | 256.0MB |
問題描述: | 問題描述 在某圖形操作系統(tǒng)中,有 N 個窗口,每個窗口都是一個兩邊與坐標(biāo)軸分別平行的矩形區(qū)域。窗口的邊界上的點也屬于該窗口。窗口之間有層次的區(qū)別,在多于一個窗口重疊的區(qū)域里,只會顯示位于頂層的窗口里的內(nèi)容?! ‘?dāng)你點擊屏幕上一個點的時候,你就選擇了處于被點擊位置的最頂層窗口,并且這個窗口就會被移到所有窗口的最頂層,而剩余的窗口的層次順序不變。如果你點擊的位置不屬于任何窗口,則系統(tǒng)會忽略你這次點擊?! ‖F(xiàn)在我們希望你寫一個程序模擬點擊窗口的過程。輸入格式 輸入的第一行有兩個正整數(shù),即 N 和 M。(1 ≤ N ≤ 10,1 ≤ M ≤ 10) 接下來 N 行按照從最下層到最頂層的順序給出 N 個窗口的位置。 每行包含四個非負整數(shù) x1, y1, x2, y2,表示該窗口的一對頂點坐標(biāo)分別為 (x1, y1) 和 (x2, y2)。保證 x1 < x2,y1 2?! 〗酉聛?M 行每行包含兩個非負整數(shù) x, y,表示一次鼠標(biāo)點擊的坐標(biāo)。 題目中涉及到的所有點和矩形的頂點的 x, y 坐標(biāo)分別不超過 2559 和 1439。輸出格式 輸出包括 M 行,每一行表示一次鼠標(biāo)點擊的結(jié)果。如果該次鼠標(biāo)點擊選擇了一個窗口,則輸出這個窗口的編號(窗口按照輸入中的順序從 1 編號到 N);如果沒有,則輸出"IGNORED"(不含雙引號)。樣例輸入3 40 0 4 41 1 5 52 2 6 61 10 04 40 5樣例輸出211IGNORED樣例說明 第一次點擊的位置同時屬于第 1 和第 2 個窗口,但是由于第 2 個窗口在上面,它被選擇并且被置于頂層?! 〉诙吸c擊的位置只屬于第 1 個窗口,因此該次點擊選擇了此窗口并將其置于頂層?,F(xiàn)在的三個窗口的層次關(guān)系與初始狀態(tài)恰好相反了?! 〉谌吸c擊的位置同時屬于三個窗口的范圍,但是由于現(xiàn)在第 1 個窗口處于頂層,它被選擇?! ∽詈簏c擊的 (0, 5) 不屬于任何窗口。 |
問題的關(guān)鍵是創(chuàng)建窗口的結(jié)構(gòu)體后怎么表示窗口的順序。這里是用一個數(shù)組來表示窗口的順序,對應(yīng)的數(shù)組的值為窗口的編號。數(shù)組的下標(biāo)越小,對應(yīng)的編號窗口越靠前。
代碼:
#include <iostream>using namespace std;/* run this PRogram using the console pauser or add your own getch, system("pause") or input loop */int n,m; //n個窗口 m個點擊事件 struct window{int winfo; //窗口的編號 int x1,y1,x2,y2;};struct click{int x,y;};window w[12];click c[11];int order[11]; //紀錄窗口順序的數(shù)組 string ans[11];int length=0; int main(int argc, char *argv[]) {while(cin>>n>>m){//輸入n個窗口 for(int i=1;i<=n;i++){int tx1,ty1,tx2,ty2;cin>>tx1>>ty1>>tx2>>ty2;w[i].x1=tx1;w[i].y1=ty1;w[i].x2=tx2;w[i].y2=ty2;w[i].winfo =i;}//初始化窗口順序的數(shù)組orderfor(int i=0;i<n;i++){order[i]=n-i; //order[i]的值為對應(yīng)窗口的編號 i越小對應(yīng)窗口的越靠前 //i == 0 窗口編號 2 既2號窗口在最前 } //輸入m個鼠標(biāo)點擊次數(shù)for(int i=0;i<m;i++){int tx,ty;cin>>tx>>ty;c[i].x=tx;c[i].y=ty;}//判斷m次點擊事件for(int i=0;i<m;i++){int winio=-1;//從窗口最上層開始判斷 int j;for(j=0;j<n;j++){ int temp_w=order[j]; //獲得當(dāng)前最靠上的窗口的編號 if((c[i].x <= w[temp_w].x2 && c[i].x >= w[temp_w].x1) && (c[i].y <= w[temp_w].y2 && c[i].y >= w[temp_w].y1)) {//i次點擊到了這個窗口 //1.紀錄其窗口號 winio=temp_w;//cout<<temp_w<<endl;//2.將此窗口移動到最前 for(int p=j;p>0;p--) //要從后開始移動 保證前面的數(shù)據(jù)不被覆蓋 {order[p]=order[p-1];}order[0]=temp_w;break; }else{//i次點擊沒有點到此窗口 判斷下一個窗口 } }if(winio == -1){cout<<"IGNORED"<<endl;}else{cout<<winio<<endl;}}}return 0;}注意:在移動數(shù)組時,需要從被替代的位置開始移動,防止有效信息被覆蓋。新聞熱點
疑難解答