天天看點

首屆CCF軟體能力認證試題第二題詳解(視窗)

筆者正在準備考研的複試,晚上花了兩個多小時做了一下CCF的前兩題,第一題比較簡單,第二題有點難,這裡分享一下思路:

題目連結:http://wenku.baidu.com/link?url=knJCvNYMG1rCHmxqB0Xg_mk7S1WKJhGlsTNVhi7DOIJKo29mIP--yKf2HUvRMEC7IBMZR-vW9kD6-_-dFjOWgny8GtBFwoN-AfGxMgXyq6G

代碼:

#include <iostream>

using namespace std;

int main()

{

//n表示視窗的個數,m表示點選的次數

freopen("in.txt","r",stdin);

freopen("out.txt","w",stdout);

int n,m,i,j,temp=-1,window=-1,a[10][4],b[10][2],c[10],jieguo[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};

cin>>n;

cin>>m;

//存儲視窗的範圍

for(i=0;i<n;i++)

{

c[i]=i;//存儲視窗的相對位置,c[0]=0表示第一個視窗在最底下,數字越大越靠近上面

for(j=0;j<4;j++)

{

cin>>a[i][j];

}

}

//存儲點選的位置

for(i=0;i<m;i++)

{

for(j=0;j<2;j++)

{

cin>>b[i][j];

}

}

for(j=0;j<m;j++)//j表示點選次數

{

for(i=0;i<n;i++)

{

if(a[i][0]<=b[j][0]&&a[i][2]>=b[j][0]&&a[i][1]<=b[j][1]&&a[i][3]>=b[j][1])//點選的位置在視窗内

{

if(c[i]>temp)//如果是更上一層的視窗

{

temp=c[i];

window=i;//點選的是第i個視窗

   jieguo[j]=i;

}

}

}

if(window!=-1)

{

for(i=0;i<n;i++)

{

if(c[i]>c[window])

c[i]--;

}

c[window]=n-1;//将被選中的視窗置于最上層

}

temp=window=-1;//恢複視窗初始值

}

//列印結果

for(i=0;i<m;i++)

{

if(jieguo[i]!=-1)

cout<<jieguo[i]+1<<endl;

else

cout<<"INGORED"<<endl;

}

return 0;

}

運作環境是VC6.0

in.txt是測試資料所在的檔案,測試資料為

3 4

0 0 4 4

1 1 5 5

2 2 6 6

1 1

0 0 

4 4

0 5

out.txt為輸出資料:

2

1

1

INGORED

思路如下:先把測試資料存儲,具體來說n存儲視窗的個數,m存儲點選的次數,a[10][4]存儲每個視窗的範圍,b[10][2]存儲點選的位置,c[10]存儲視窗的相對位置,jieguo[10]存儲最後輸出的值,c[0]=0表示第0個視窗在最下面,數字越大,視窗越靠上,初始時視窗的序号和存儲的位置是相同的

第二步,對每個點選的位置進行測試,就是最外面的那個for循環;如果點選的位置在某個視窗内且該視窗比之前的視窗更靠近上方(c[i]>temp),則window變為該視窗,表示選中

該視窗,之後,調整視窗的相對位置,将被選中的視窗置于最上方,之前在它上方的每個視窗都要下拉一層。

最後列印結果,因為題目中視窗從1開始編号,是以結果都要加1

不足之處希望批評指正

繼續閱讀